Windows在实践中命名pipe道

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

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

当我的写入失败,因为客户端断开连接,我应该调用DisconnectNamedPipeCloseHandle ,或者我的句柄。

然后,接受一个新的连接,我应该调用CreateNamedPipe然后ConnectNamedPipe ,或者只是ConnectNamedPipe

我非常想解释一下由于这些调用的结果,我的pipe道可能处于不同的状态,因为我没有在其他地方find它。

附加信息:

语言:Python使用win32pipewin32filewin32api库。

pipe道设置:等待,不重叠,字节stream。

Solutions Collecting From Web of "Windows在实践中命名pipe道"

最好调用DisconnectNamedPipe然后调用CloseHandle ,尽管CloseHandle应该清理所有东西。

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

确保你正在清理管道,但MSDN声明如下

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

如果你正在创建/销毁大量的管道,我也会考虑上面的内容。 我的猜测是,如果有许多客户端并且有一些增长/收缩机制到池中,那么操作一个管道处理池会更好。

我设法达到了我想要的。 我每次会话只调用一次CreateNamedPipeCloseHandle ,当我写入失败时,我调用DisconnectNamedPipe ,接着是另一个ConnectNamedPipe

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

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