【问题标题】:Only one client can connect to named pipe只有一个客户端可以连接到命名管道
【发布时间】:2010-12-06 02:02:57
【问题描述】:

我目前正在使用 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();

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

非常感谢您!

【问题讨论】:

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


    【解决方案1】:

    您可以在此处查找一些信息: Number of Clients that can connect to a Named Pipe

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

    据我了解,您应该创建一个多线程应用程序。主线程应该负责未来的连接,每个新连接都应该在新线程中启动。

    【讨论】:

      【解决方案2】:

      感谢您的快速帮助。

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

      在服务器端发布的 NamedPipeServerStream-using 块中,我有一个 StreamReader 被另一个 using 块包围。

      当这个块完成关闭 StreamReader 时,它也出于某种原因断开了 NamedPipeServerStream。我也没有将 pipeStream.WaitForConnection() 封闭在一个循环中。

      【讨论】:

      • 所以,你可以关闭这个问题))
      【解决方案3】:

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

      但是,无论最终答案是什么,我都建议看一下 WCF - 它支持网络管道绑定(以及许多其他东西,例如二进制 TCP、SOAP 有或没有 WS-* 规范,只需更改配置) 并为您处理服务器激活和多线程。 .net 3.5 可用,所以我肯定会选择它。

      【讨论】:

        【解决方案4】:

        请在此处查看我对 how to implement a multi threaded pipe server in .NET 的回答。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          相关资源
          最近更新 更多