我试图在.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
}
}
}
我接近这个权利吗?
当两个客户端同时打开连接时会发生什么?
他们会共享相同的流,数据会混合在一起吗?
我该如何避免这种情况?
任何关于此的想法或资源都会有所帮助。我对这个话题很陌生。
答案 0 :(得分:14)
您将希望服务器能够处理并发客户端连接,并且每个客户端都可以连接到管道的不同实例上的服务器,而不是像目前的代码那样尝试在一个管道实例上执行所有操作。当客户端完成后,您希望释放与该客户端通信时使用的管道实例,而不是重复使用它。
This answer给出了伪代码大纲,说明了这种方法。
另请注意,在消息模式下,您需要在循环中读取管道,直到IsMessageComplete
属性变为true
。这是保证您获得每条完整信息的唯一方法。另请注意,消息模式中的“消息”表示发送方在一次Write
调用管道时写入的字节流。
客户端流不能相互混淆:管道实例只有两端, 客户端和 服务器。