2009-08-12 131 views
5

说服务器创建了一个命名管道“myTestPipe”。有多少客户可以连接到“myTestPipe”?从我在网上阅读的内容看来,似乎只有一个客户可以,但想要确认。可以连接到命名管道的客户端数

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

回答

9

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

(不幸的是,我不能追查参考相应的MSDN页面,但是这个CPAN pipes reference提到了这一限制。)

+1

感谢您的回复。 虽然我有一个问题:我正在实现一个接收由NamedPipeClients通过命名管道发送的二进制文件的服务器。假设我有一个多线程的NamedPipeClient,我可以在其中实例化多个线程同时发送文件。服务器如何区分实际发送这些字节的源客户端?也许我的问题应该是:当有多个客户将数据写入管道时,它是否与其他人重叠,这样你就不知道谁发了什么?希望它解释得很好! 再次感谢 – Derar 2009-08-14 17:42:23

+1

实际上这里有几个不同的选项,包括使用重叠的I/O,多线程或完成例程。 MSDN具有处理来自单个服务器的多个客户端连接的良好文档(包括所有3个选项):http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx – 2009-08-14 18:39:10

+0

这很重要在上面,请记住单个服务器管道实例只能处理单个客户端。给定的_named pipe_可以处理多个连接,但每个连接仍然需要等待并由单独的服务器管道实例处理。一旦服务器管道实例已连接,它就不能用于其他连接,直到当前连接断开连接并且服务器管道可以等待另一连接。上面的答案与事实是一致的,但是由于命名管道和服务器管道对象之间的混淆,并没有说清楚。 – 2017-07-25 21:36:18

9

实际上创建一个管道,并等待连接,而当它连接,创建一个第二个,然后等待它。

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

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

+0

当有太多的客户连接太快的情况时,你如何处理?我让自己的垃圾邮件发送者对我的服务器执行了20次使用你的方法的请求,但是在2-3次客户端连接之后,剩下的请求会尝试连接到现有的管道,但是当他们尝试发送请求时,管道已经关闭。有没有办法限制每个'NamedPipeServerStream'的连接数? – codenamezero 2017-10-18 17:04:17

相关问题