[英]Windows named pipes in practice
使用Windows命名管道,使用CreateNamedPipe
, ConnectNamedPipe
, DisconnectNamedPipe
和CloseHandle
调用的正确方法是什么?
我正在制作一个连接到客户端应用程序的服务器应用程序,该应用程序在会话中多次连接和断开管道。
当我的写入因客户端断开而失败时,我应该调用DisconnectNamedPipe
, CloseHandle
,或者我的句柄上没有任何内容。
然后,要接受新连接,我应该调用CreateNamedPipe
然后调用ConnectNamedPipe
,还是只调用ConnectNamedPipe
?
我非常希望通过这些调用来解释我的管道可能存在的不同状态,因为我没有在其他地方找到它。
附加信息:
语言:Python使用win32pipe
, win32file
和win32api
库。
管道设置:WAIT,无重叠,字节流。
最好调用DisconnectNamedPipe
然后调用CloseHandle
,尽管CloseHandle
应该清理所有内容。
MSDN文档有点模糊,他们的服务器示例非常基本。 至于你是否重复使用管道把手,它似乎是你自己的选择。 DisconnectNamedPipe
文档似乎表明您可以通过在断开连接后再次在该句柄上调用ConnectNamedPipe
来重新使用新客户端的管道句柄。 ConnectNamedPipe
的作用似乎是将连接客户端分配给句柄。
尽管MSDN声明如下,但请确保清理管道
每次创建命名管道时,系统都会使用非分页池创建入站和/或出站缓冲区,非分页池是内核使用的物理内存。 您可以创建的管道实例(以及线程和进程等对象)的数量受可用非页面缓冲池的限制。 每个读取或写入请求都需要缓冲区中用于读取或写入数据的空间,以及内部数据结构的额外空间。
如果您正在创建/销毁大量管道,我也会考虑到上述情况。 我猜想如果有很多客户端并且对池有一些增长/收缩机制,那么操作一个管道句柄池会更好。
我成功实现了我的目标。 我在每个会话中只调用一次CreateNamedPipe
和CloseHandle
,并且在写入失败时调用DisconnectNamedPipe
,然后调用另一个ConnectNamedPipe
。
诀窍是只在实际连接管道时调用DisconnectNamedPipe
。 每当我试图连接“只是为了确定”时我就打电话给它,它给了我奇怪的错误。
有关管道的更多信息,另请参阅djgandy的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.