我正在尝试在.NET 中实现命名管道服务器。客户端将是 C++。发送的数据的性质与问题无关。
我的第一个简单的实现看起来像这样:
using (NamedPipeServerStream stream =
new NamedPipeServerStream(PipeName,
PipeDirection.InOut,
numberOfListeners,
PipeTransmissionMode.Message))
{
while (true)
{
try
{
stream.WaitForConnection();
var request = ReadRequest(stream);
var reply = Process(request);
WriteReply(stream, reply);
stream.WaitForPipeDrain();
}
catch (Exception ex)
{
//TO DO: log
}
}
}
我这样做对吗?
当两个客户端同时打开连接时会发生什么?
它们会共享相同的流并且数据会混合吗?
我怎样才能避免这种情况?
任何有关这方面的想法或资源都会有所帮助。我对这个话题很陌生。
您将希望服务器能够处理并发客户端连接,并且每个客户端都在管道的不同实例上连接到服务器,而不是像您的代码目前那样尝试在一个管道实例上执行所有操作。当客户端完成时,您希望释放与该客户端通信时使用的管道实例,而不是重用它。
这个答案 https://stackoverflow.com/questions/4451805/windows-named-pipe-issue-error-code-233-alternates/4475816#4475816给出了一种方法的伪代码概述。
另请注意,在消息模式下,您需要循环从管道中读取数据,直到IsMessageComplete
财产变成true
。这是保证您收到每条完整消息的唯一方法。另请注意,消息模式中的“消息”表示发送者一次性写入的字节流Write
调用管道。
客户端流不能相互混合:管道实例只有两端,THE客户和THE server.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)