6

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

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

当由于客户端断开连接而导致我的写入失败时,我应该调用DisconnectNamedPipe,CloseHandle还是什么都不在我的句柄上。

那么,要接受一个新的连接,我应该调用CreateNamedPipethenConnectNamedPipe还是只调用ConnectNamedPipe

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

附加信息:

语言:Python 使用win32pipe,win32filewin32api库。

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

4

2 回答 2

5

DisconnectNamedPipe调用then是个好习惯CloseHandle,尽管CloseHandle应该清理所有内容。

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

确保您正在清理管道,尽管 MSDN 声明如下

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

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

于 2013-08-06T11:11:44.700 回答
1

我已经成功地实现了我想要的。我每个会话只调用一次,当我的写入失败时我调用CreateNamedPipe,然后是另一个.CloseHandleDisconnectNamedPipeConnectNamedPipe

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

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

于 2014-06-04T08:13:39.367 回答