2013-08-06 44 views
4

使用Windows命名管道,使用CreateNamedPipe,ConnectNamedPipe,DisconnectNamedPipeCloseHandle调用的正确方法是什么?在实践中Windows命名管道

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

当我写入失败,因为客户端断开连接,我应该拨打DisconnectNamedPipe,CloseHandle,或我的手柄上没有任何东西。

然后,要接受一个新的连接,我应该叫CreateNamedPipe,然后ConnectNamedPipe,或只是ConnectNamedPipe

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

附加信息:

语言:Python的使用win32pipewin32filewin32api库。

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

回答

0

我已经设法达到我想要的。我每个会话只需拨打CreateNamedPipeCloseHandle一次,当我写入失败时,我拨打DisconnectNamedPipe,然后再拨打ConnectNamedPipe

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

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

3

虽然CloseHandle应该清理所有东西,但最好是拨打DisconnectNamedPipe然后CloseHandle

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

确保你正在清理管道但正如MSDN指出the following

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

如果您正在创建/销毁大量管道,我还会记住上述内容。我的猜测是,如果有许多客户端并对池有一些增长/收缩机制,那么操作一个管道句柄池会更好。