对于Windows命名管道,使用命名管道的正确方法是什么CreateNamedPipe
, ConnectNamedPipe
, DisconnectNamedPipe
, and CloseHandle
calls?
我正在制作一个服务器应用程序,它连接到一个客户端应用程序,该应用程序在一个会话中多次连接和断开到管道。
当我的写入由于客户端断开连接而失败时,我应该调用DisconnectNamedPipe
, CloseHandle
,或者我的手柄上什么也没有。
然后,要接受新连接,我应该调用CreateNamedPipe
进而ConnectNamedPipe
, 要不就ConnectNamedPipe
?
我非常希望解释这些调用导致我的管道可能处于的不同状态,因为我在其他地方没有找到这个。
附加信息:
语言:Python 使用win32pipe
,win32file
and win32api
图书馆。
管道设置:WAIT、无重叠、字节流。
打电话是个好习惯DisconnectNamedPipe
then CloseHandle
, 虽然CloseHandle
应该清理一切。
MSDN 文档有点模糊,他们的服务器示例是非常基本的。至于是否重复使用管柄,似乎是你自己的选择。文档 for DisconnectNamedPipe
似乎表明您可以通过调用为新客户端重新使用管道句柄ConnectNamedPipe
断开连接后再次在该手柄上。的作用ConnectNamedPipe
似乎是将连接客户端分配给一个句柄。
确保你正在清理管道,正如 MSDN 所说下列
每次创建命名管道时,系统都会使用非分页池(内核使用的物理内存)创建入站和/或出站缓冲区。您可以创建的管道实例(以及线程和进程等对象)的数量受到可用的非分页池的限制。每个读取或写入请求都需要缓冲区中的空间用于读取或写入数据,以及用于内部数据结构的额外空间。
如果您要创建/销毁大量管道,我也会记住上述内容。我的猜测是,如果有很多客户端并且池有一些增长/收缩机制,那么操作一个管道句柄池会更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)