C#:异步NamedPipeServerStream的理解

Ksi*_*ice 4 c# asynchronous named-pipes

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

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

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

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);
Run Code Online (Sandbox Code Playgroud)

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

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

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
Run Code Online (Sandbox Code Playgroud)

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

问题2:我应该这样做

while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}
Run Code Online (Sandbox Code Playgroud)

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

然后......让我们来看看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);
        }
Run Code Online (Sandbox Code Playgroud)

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

管道还没有连接.

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

Han*_*ant 9

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

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

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

  • 嗯,听起来很有帮助.我已经回答了三个问题,您需要点击第四个问题的"提问"按钮并正确记录. (5认同)