Win32命名管道行为

时间:2016-06-11 02:38:07

标签: windows multithreading winapi

Win7,x64,C ++,Win32 API,控制台应用,Visual Studio社区2015

我已经搜索了所有关于命名管道的SO问题,但找不到我需要的答案。

我正在编写一个服务器,通过命名管道将数据以一种方式广播到同一台机器上的多个相同客户端。服务器和每个客户端都在自己的进程(.exe)中。当 all 客户端以某种方式向服务器发出信号通知它们已准备好(通过命名事件或其他机制)时,将发送数据。

documentation表示多个客户端可以连接到单个管道实例,但随后继续讨论multiple instances

我对服务器端的管道有几个问题:

  1. 对于少量客户端和低吞吐量,这是最简单的:1个线程,1个管道实例; 1个线程和多个管道实例;多个线程和每个线程一个实例?
  2. 如果单个线程在同一个管道实例上多次ConnectNamedPipe,这是否意味着将一个WriteFile广播到已连接到该管道特定实例的所有客户端?< / LI>
  3. 如果多个客户端可以连接到管道的特定实例,是否从服务器端块写入该管道,直到 all 客户端已读取上一条消息?
  4. 做一对多的情况并不常见?为什么?

1 个答案:

答案 0 :(得分:1)

  

文档说多个客户端可以连接到单个管道实例

不,它没有。你误解了它实际说的内容。

  

然后继续讨论多个实例。

每个管道实例一次只能与一个客户端通信。当客户端完成后,服务器可以断开实例并将其重新用于新客户端,也可以销毁实例并创建新实例。无论哪种方式,服务器都必须为每个连接的客户端创建一个单独的管道实例。

  

1.对于少量客户端和低吞吐量,这是最简单的:1个线程,1个管道实例; 1个线程和多个管道实例;多个线程和每个线程一个实例?

第一种方式一次只允许1个客户。

第二种方式允许服务器创建多个实例来处理同时连接,但需要使用重叠I / O,因此1个线程可以管理多个连接。

第三种方式还允许服务器创建多个实例来处理同时连接,但是最简单,因为服务器可以在自己的线程中运行每个实例,为当前连接到该实例的客户端提供服务。不需要重叠的I / O.

  

2.如果单个线程在同一个管道实例上多次执行ConnectNamedPipe,这是否意味着将一个WriteFile广播到已连接到该特定管道实例的所有客户端?

     

3.如果多个客户端可以连接到管道的特定实例,是否从服务器端块写入该管道,直到所有客户端都读取了上一条消息?

否和否,因为多个客户端无法同时连接到单个实例。

  

4.做一对多的情况并不常见?

命名管道无法实现一对多。但是,您可以同时具有多个一对一连接,并且在多个连接之间广播数据的情况并不少见。在这种情况下,您最好在每个连接或重叠的I / O中使用单独的线程。这样,如果一个客户端阻止,则不阻止其他客户端等待它。

相关问题