繁体   English   中英

Windows在实践中命名管道

[英]Windows named pipes in practice

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

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

当我的写入因客户端断开而失败时,我应该调用DisconnectNamedPipeCloseHandle ,或者我的句柄上没有任何内容。

然后,要接受新连接,我应该调用CreateNamedPipe然后调用ConnectNamedPipe ,还是只调用ConnectNamedPipe

我非常希望通过这些调用来解释我的管道可能存在的不同状态,因为我没有在其他地方找到它。

附加信息:

语言:Python使用win32pipewin32filewin32api库。

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

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

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

尽管MSDN声明如下,但请确保清理管道

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

如果您正在创建/销毁大量管道,我也会考虑到上述情况。 我猜想如果有很多客户端并且对池有一些增长/收缩机制,那么操作一个管道句柄池会更好。

我成功实现了我的目标。 我在每个会话中只调用一次CreateNamedPipeCloseHandle ,并且在写入失败时调用DisconnectNamedPipe ,然后调用另一个ConnectNamedPipe

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM