我试图找到异步NamedPipeServerStream的任何好的和清晰的示例,但找不到任何适合我的。
我希望NamedPipe Server异步接受来自客户端的消息。客户很简单,对我来说很好。但是我找不到服务器的例子,或者无法理解它是如何工作的。
现在据我所知,我需要创建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组织异步工作?
答案 0 :(得分:8)
您修改PipeSecurity以限制对管道的访问,只允许有祝福的程序连接到您的服务。把它放在后面的燃烧器上,直到你完成这项工作并进行安全分析,证明这种限制是合理的。
“一些奇怪的东西”只是一个可以传递给回调方法的任意对象。您通常不需要它,但如果您编写回调函数,它可以提供帮助,因此它可以提供多个连接。在这种情况下,您需要了解有关已连接的特定管道的更多信息, state 参数允许您传递该信息。在回调方法中,result.AsyncState属性为您提供返回该对象的引用。只有在以后担心,你会在需要时找到它的用途。只需通过null
直到那时。
这是一个错误。在对管道执行任何其他操作之前,必须首先调用EndWaitForConnection()。只需将其移至方法的顶部即可。您通常希望在try / catch中编写它,以便捕获ObjectDisposedException,这是在退出程序之前关闭管道时引发的异常。