Windows在实践中命名管道

oyv*_*ind 5 python windows winapi named-pipes

随着Windows命名管道,什么是使用正确的方法CreateNamedPipeConnectNamedPipeDisconnectNamedPipe,和CloseHandle电话?

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

当我写失败,因为客户端断开连接,我应该打电话DisconnectNamedPipeCloseHandle或没有在我的把手。

然后,要接受新的连接,我应该先呼叫CreateNamedPipe,然后再呼叫ConnectNamedPipe还是ConnectNamedPipe

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

附加信息:

语言:使用Python win32pipewin32filewin32api图书馆。

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

djg*_*ndy 5

这是很好的做法称之为DisconnectNamedPipe那么CloseHandle,虽然CloseHandle应该清理一切。

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

确保您正在清理管道,尽管MSDN指出以下内容

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

如果您要创建/销毁大量管道,我也谨记以上几点。我的猜测是,如果有许多客户端并且对该池具有某种增长/收缩机制,则最好操作一个管道句柄池。


oyv*_*ind 1

我已经成功实现了我想要的目标。我在每个会话中调用CreateNamedPipeand一次,并且在写入失败时CloseHandle调用,然后调用另一个.DisconnectNamedPipeConnectNamedPipe

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

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