[英]Win32 Named pipe behavior
Win7,x64,C ++,Win32 API,控制台应用程序,Visual Studio Community 2015
我在命名管道上搜索了所有SO问题,但找不到所需的答案。
我正在编写一个服务器,以通过命名管道向同一台计算机上的多个相同客户端以一种方式广播数据。 服务器和每个客户端都在其自己的进程(.exe)中。 当所有客户端以某种方式(通过命名事件或其他机制)向服务器发信号通知它们已准备就绪时,将发送数据。
该文档说,多个客户端可以连接到单个管道实例,但随后可以讨论多个实例 。
我对服务器端管道有一些疑问:
ConnectNamedPipe
,这是否意味着向所有已连接到该管道的特定实例的所有客户端广播单个WriteFile
? 该文档说多个客户端可以连接到单个管道实例
不,不是。 您误读了它的实际意思。
但是接下来要讨论多个实例。
每个管道实例一次只能与一个客户端通信。 客户端完成后,服务器可以断开实例并将其重新用于新客户端,也可以销毁该实例并创建一个新实例。 无论哪种方式,服务器都必须为每个连接的客户端创建一个单独的管道实例。
1.对于少量客户端和低吞吐量,这是最简单的:1个线程,1个管道实例; 1个线程和多个管道实例; 多个线程,每个线程一个实例?
第一种方式一次只允许一个客户。
第二种方法允许服务器创建多个实例来处理同时连接,但是要求使用重叠的I / O,以便1个线程可以管理多个连接。
第三种方式还允许服务器创建多个实例来处理同时连接,但是最简单的方法是,服务器可以在其自己的线程中运行每个实例,为当前连接到该实例的任何客户端提供服务。 不需要重叠的I / O。
2.如果单个线程在管道的同一实例上多次执行ConnectNamedPipe,这是否意味着向所有已连接到该管道的特定实例的所有客户端广播单个WriteFile?
3.如果多个客户端可以连接到管道的特定实例,则从服务器端写入该管道是否会阻塞,直到所有客户端都读取了上一条消息?
不,不,因为不能将多个客户端同时连接到单个实例。
4.在一对多情况下不常见吗?
命名管道不能一对多。 但是您可以同时具有多个一对一连接,并且在多个连接之间广播数据并不少见。 在这种情况下,最好对每个连接或重叠的I / O使用单独的线程。 这样,如果一个客户端确实阻止了,其他客户端就不会被阻止等待它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.