可以连接到命名管道的客户端数量

Posted

技术标签:

【中文标题】可以连接到命名管道的客户端数量【英文标题】:Number of Clients that can connect to a Named Pipe 【发布时间】:2009-08-12 15:16:08 【问题描述】:

假设服务器创建了一个命名管道“myTestPipe”。有多少客户端可以连接到“myTestPipe”?根据我在网上看到的内容,似乎只有一个客户可以,但想确定一下。

如果只有一个,那么最好使用阻塞 WaitForConnection() 而不是 Asunchronous 方法 BeginWaitForConnection() 因为服务器会等到客户端进程连接然后进行通信?! (无需担心其他客户端连接)

【问题讨论】:

【参考方案1】:

您可以让多个客户端连接到同一个命名管道。在 Windows 上,我认为当前的限制是 256 个同时连接到单个命名管道,包括服务器的连接。

(很遗憾,我无法找到相应的 MSDN 页面以供参考,但这个 CPAN pipes reference 提到了这个限制。)

【讨论】:

感谢您的回复。不过我有一个问题:我正在实现一个服务器,它接收 NamedPipeClients 通过命名管道发送的二进制文件。假设我有一个多线程 NamedPipeClient,我可以在其中实例化多个线程以同时发送文件。服务器如何区分实际发送这些字节的源客户端?也许我的问题应该是:当多个客户端将数据写入管道时,它是否与其他客户端重叠,您无法分辨谁发送了什么?希望解释清楚!再次感谢 这里实际上有几个不同的选项,包括使用重叠 I/O、多线程或完成例程。 MSDN 有很好的文档(包括所有 3 个选项)来处理来自单个服务器的多个客户端连接:msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx 在上面重要的是要记住一个服务器管道实例只能处理一个客户端。一个给定的命名管道可以处理多个连接,但是这些连接中的每一个仍然需要由一个单独的服务器管道实例来等待和处理。一旦服务器管道实例连接,它就不能用于其他连接,直到当前连接断开并且服务器管道可以等待另一个。上面的答案与事实是一致的,但并没有说清楚,因为命名管道和服务器管道对象之间存在混淆。【参考方案2】:

您实际上创建了一个管道并等待连接,当它连接时,创建第二个管道并等待它。

对于您创建并等待连接的每个管道,您最多获得一个连接(一次 - 如果它们是请求/响应/关闭样式,您可以回收它们)。

因此,每个连接都是一对一的,就像套接字或其他流一样。

【讨论】:

客户端太多连接太快的情况怎么处理?我让自己的垃圾邮件发送者使用您的方法向我的服务器执行 20 个请求,但是在 2-3 个客户端连接之后,请求的其余部分将尝试连接到现有管道,但是当他们尝试发送请求时,管道是已经关闭。有没有办法限制每个NamedPipeServerStream 的连接数?

以上是关于可以连接到命名管道的客户端数量的主要内容,如果未能解决你的问题,请参考以下文章

命名管道客户端无法连接到作为网络服务运行的服务器

我可以拥有多少个命名管道?

获取使用 C# 连接到命名管道服务器的客户端的进程 ID

使用命名管道连接到 LibreOffice

禁用命名管道

c#命名管道双向通信