【问题标题】:Win32 Named pipe behaviorWin32 命名管道行为
【发布时间】:2016-06-11 02:38:06
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 文档说多个客户端可以连接到单个管道实例 - 不,您误读和/或误解了它。每个实例一次只能支持一个客户端。 (为了回答您的问题,对于少量客户端和低吞吐量,每个客户端使用一个线程是最简单的。)

标签: windows multithreading winapi


【解决方案1】:

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

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

然后继续谈论多个实例。

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

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

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

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

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

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

3.如果多个客户端可以连接到一个特定的管道实例,在所有客户端都读完之前的消息之前,从服务器端写入该管道是否会阻塞?

不是也不是,因为多个客户端不能同时连接到一个实例。

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

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多