C#:异步NamedPipeServerStream的理解

我试图找到异步NamedPipeServerStream的任何好的和明确的例子,找不到任何适合我的。

我想让NamedPipe Server异步接受来自客户端的消息。 客户很简单,对我来说很好。 但是我找不到服务器的例子,或者无法理解它是如何工作的。

现在据我所知,我需要创建NamedPipeServerStream对象。 我们开工吧:

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE); 

似乎工作。 但我不知道,我是否必须使用PipeSecurity或PipeAccessRule? 我呢? 我的服务器将在本地系统中用作Windows服务。

接下来是什么? 我想我需要使用BeginWaitForConnection进行异步连接。 让我们来看看:

 namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, ); 

问题1 :这有什么“奇怪的东西”? 如何使用它?

问题2 :我应该这样做

 while(true) { namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, ); } 

让我的服务器总是等待连接? 或者我需要以其他方式做到这一点?

然后……让我们来看看WaitForConnectionAsyncCallback函数:

 private void WaitForConnectionAsyncCallback(IAsyncResult result) { Console.WriteLine("Client connected."); byte[] buff = new byte[BUFFERSIZE]; namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize); string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize); Console.WriteLine(" " + recStr); namedPipeServerStream.EndWaitForConnection(result); } 

..当然这不起作用。 因为我不知道如何从流中接收字符串。 怎么样? 现在它引发了一个InvalidOperationException:

管道还没有连接。

那么如何使用NamedPipeServerStream组织异步工作呢?

  • 您修改PipeSecurity以限制对管道的访问,只允许有祝福的程序连接到您的服务。 把它放在后面燃烧器上,直到你完成这项工作并进行安全分析,certificate这种限制是有必要的。

  • “一些奇怪的东西”只是一个可以传递给回调方法的任意对象。 您通常不需要它,但如果您编写回调函数,它可以提供帮助,因此它可以提供多个连接。 在这种情况下,您需要了解有关已连接的特定管道的更多信息, state参数允许您传递该信息。 在回调方法中,result.AsyncState属性为您提供返回该对象的引用。 以后只会担心,您会在需要时找到它的用途。 直到那时才传递null

  • 这是一个错误。 在对管道执行任何其他操作之前,必须首先调用EndWaitForConnection()。 只需将其移至方法的顶部即可。 您通常希望在try / catch中编写它,以便捕获ObjectDisposedException,这是在退出程序之前关闭管道时引发的exception。