只有一个客户端可以连接到命名管道

时间:2009-10-12 18:39:27

标签: c# asp.net-3.5 named-pipes

我目前正在使用ASP.NET 3.5和C#学习Windows中的命名管道。 我写了一个小型服务器程序,它创建了一个命名管道:

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(pipeName))
{
  pipeStream.WaitForConnection();
  // do sth.
}

和打开管道的客户端应用程序如下:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(pipeName))
{ 
  pipeStream.Connect();
  // do sth.
}

只要只有一个客户端连接到管道,这就很有效。它既可以读写,也可以写入。如果我尝试连接第二个客户端,代码永远不会超过行

pipeStream.Connect();

服务器和所有客户端都在同一台计算机上运行。 有什么想法吗?

非常感谢你!

4 个答案:

答案 0 :(得分:4)

你可以在这里查看一些信息: Number of Clients that can connect to a Named Pipe

在MSDN中:http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx

据我所知,您应该创建一个多线程应用程序。主线程应该负责将来的连接,并且每个新连接都应该在新线程中启动。

答案 1 :(得分:1)

感谢您的快速帮助。

我已经在单独的线程中处理了实际处理,但忘记提及。 一位同事发现了这个问题:

我在服务器端发布的NamedPipeServerStream-using块中使用了另一个封闭的StreamReader。

当此块完成关闭StreamReader时,它还因某种原因断开了NamedPipeServerStream。另外,我没有在循环中包含pipeStream.WaitForConnection()。

答案 2 :(得分:0)

真正的管道(来自hardwre商店的管道)有两个结尾。所以我希望命名管道也有两个端点,一个用于服务器进程,另一个用于客户端进程。

然而,不管最后的答案是什么,我建议看一下WCF - 它支持网络管道绑定(以及许多其他像二进制TCP,只要更改配置就有或没有WS- *规范的SOAP) )并为您处理服务器激活和多线程。 .net 3.5可用,所以我肯定会选择它。

答案 3 :(得分:0)