4

我试图找到任何好的和清晰的异步 NamedPipeServerStream 示例,但找不到适合我的示例。

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

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

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

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

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

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);

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

问题2:我应该这样做

while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}

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

然后...让我们看一下 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 组织异步工作呢?

4

1 回答 1

10
  • 您修改 PipeSecurity 以限制对管道的访问,只允许受祝福的程序连接到您的服务。把它放在次要位置,直到你完成这项工作并进行了安全分析,表明这种限制是合理的。

  • “一些奇怪的事情”只是您可以传递给回调方法的任意对象。您并不经常需要它,但如果您编写回调以便它服务于多个连接,它会很有帮助。在这种情况下,您需要了解有关已连接的特定管道的更多信息,state参数允许您传递该信息。在您的回调方法中,result.AsyncState 属性为您提供对该对象的引用。以后只需要担心它,您会在需要时找到它的用途。就这样过去null吧。

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

于 2012-07-11T15:28:46.410 回答