【问题标题】:Windows named pipes in practice实践中的 Windows 命名管道
【发布时间】:2013-08-06 10:07:23
【问题描述】:

对于 Windows 命名管道,使用 CreateNamedPipeConnectNamedPipeDisconnectNamedPipeCloseHandle 调用的正确方法是什么?

我正在制作一个服务器应用程序,该应用程序连接到客户端应用程序,该客户端应用程序在会话中多次连接和断开管道。

当我的写入因客户端断开连接而失败时,我应该调用DisconnectNamedPipeCloseHandle,还是什么都不做。

那么,要接受新连接,我应该先拨打CreateNamedPipe,然后拨打ConnectNamedPipe,还是只拨打ConnectNamedPipe

我非常想解释一下我的管道由于这些调用而可能处于的不同状态,因为我在其他地方没有找到这个。

附加信息:

语言:Python 使用 win32pipewin32filewin32api 库。

管道设置:WAIT、无重叠、字节流。

【问题讨论】:

    标签: python windows winapi named-pipes


    【解决方案1】:

    最好先调用DisconnectNamedPipe,然后再调用CloseHandle,尽管CloseHandle 应该清理所有内容。

    MSDN 文档有点模糊,他们的server example 非常基础。至于是否重复使用管道句柄,似乎是你自己的选择。 Documentation for DisconnectNamedPipe 似乎表明您可以通过在断开连接后再次在该句柄上调用 ConnectNamedPipe 来为新客户端重新使用管道句柄。 ConnectNamedPipe 的作用似乎是将连接客户端分配给句柄。

    确保您正在清理管道,尽管 MSDN 声明 the following

    每次创建命名管道时,系统都会使用非分页池创建入站和/或出站缓冲区,这是内核使用的物理内存。您可以创建的管道实例(以及线程和进程等对象)的数量受可用的非分页池的限制。每个读取或写入请求都需要缓冲区中用于读取或写入数据的空间,以及用于内部数据结构的额外空间。

    如果您要创建/销毁大量管道,我也会考虑以上内容。我的猜测是,如果有很多客户端并且对池有一些增长/收缩机制,那么操作一个管道句柄池会更好。

    【讨论】:

      【解决方案2】:

      我已经实现了我想要的。我每次会话只调用一次CreateNamedPipeCloseHandle,当我的写入失败时我调用DisconnectNamedPipe,然后是另一个ConnectNamedPipe

      诀窍是仅在管道实际连接时才调用DisconnectNamedPipe。我每次尝试“只是为了确定”连接时都会调用它,它给了我奇怪的错误。

      有关管道的更多信息,另请参阅 djgandy 的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2018-07-10
        • 2010-12-18
        • 2012-01-19
        • 1970-01-01
        相关资源
        最近更新 更多