Windows Win32命名管道行为 win7、x64、C++、win32 API、控制台应用程序、Visual Studio社区2015版/P>

Windows Win32命名管道行为 win7、x64、C++、win32 API、控制台应用程序、Visual Studio社区2015版/P>,windows,multithreading,winapi,Windows,Multithreading,Winapi,我已经搜索了所有关于命名管道的SO问题,但找不到我需要的答案 我正在编写一个服务器,通过命名管道将数据以一种方式广播到同一台机器上的多个相同客户端。服务器和每个客户端都在自己的进程(.exe)中。当所有客户端都以某种方式向服务器发回准备就绪的信号时(通过命名事件或其他机制),数据就会被发送 报告说,多个客户端可以连接到单个管道实例,但随后继续讨论 关于服务器端的管道,我有几个问题: 对于少量客户端和低吞吐量,这是最简单的:1个线程,1个管道实例;1个螺纹和多个管道实例;多个线程,每个线程一个实例

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

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

报告说,多个客户端可以连接到单个管道实例,但随后继续讨论

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

  • 对于少量客户端和低吞吐量,这是最简单的:1个线程,1个管道实例;1个螺纹和多个管道实例;多个线程,每个线程一个实例
  • 如果一个线程在同一管道实例上多次执行
    ConnectNamedPipe
    ,这是否意味着一个
    WriteFile
    将广播给已连接到该管道特定实例的所有客户端
  • 如果多个客户端可以连接到某个管道的特定实例,那么在所有客户端都已读取上一条消息之前,是否会阻止从服务器端写入该管道
  • 一对多的情况是否不常见?为什么? 文档中说,多个客户端可以连接到单个管道实例

    不,没有。你误读了它实际上说的话

    然后继续讨论多个实例

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

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

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

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

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

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

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

    否和否,因为多个客户端不能同时连接到单个实例

    4.一对多的情况是否不常见

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

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

    不,没有。你误读了它实际上说的话

    然后继续讨论多个实例

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

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

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

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

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

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

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

    否和否,因为多个客户端不能同时连接到单个实例

    4.一对多的情况是否不常见

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

    文档中说多个客户端可以连接到单个管道实例-不,您误读和/或误解了它。每个实例一次只能支持一个客户端。(回答你的问题,只需一小部分