Windows命名管道在实践中的应用

2024-09-28 01:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

对于Windows命名管道,使用CreateNamedPipeConnectNamedPipeDisconnectNamedPipe和{}调用的正确方法是什么?在

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

当我的写操作因为客户机断开连接而失败时,我应该调用DisconnectNamedPipeCloseHandle,还是不调用我的句柄。在

那么,要接受一个新的连接,我应该先调用CreateNamedPipe,然后再调用ConnectNamedPipe,还是仅仅调用ConnectNamedPipe?在

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

附加信息:

语言:使用win32pipewin32filewin32api库的Python。在

管道设置:等待,无重叠,bytestream。在


Tags: 方法应用程序客户端客户机管道windows状态地方
2条回答

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

MSDN文档有点模糊,它们的server example非常基本。至于是否重用管道句柄,这似乎是你自己的选择。Documentationfor DisconnectNamedPipe似乎表示可以在断开连接后再次调用该句柄上的ConnectNamedPipe,从而为新客户机重用管道句柄。ConnectNamedPipe的作用似乎是将一个连接客户机分配给一个句柄。在

请确保您正在清理管道,尽管MSDN声明the following

Every time a named pipe is created, the system creates the inbound and/or outbound buffers using nonpaged pool, which is the physical memory used by the kernel. The number of pipe instances (as well as objects such as threads and processes) that you can create is limited by the available nonpaged pool. Each read or write request requires space in the buffer for the read or write data, plus additional space for the internal data structures.

如果您要创建/销毁大量管道,我也会记住上述内容。我想,如果有很多客户机,并且对池有一些增长/收缩机制,那么最好操作管道句柄池。在

我成功地实现了我想要的。我每次会话只调用一次CreateNamedPipeCloseHandle,当写入失败时,我调用DisconnectNamedPipe,然后是另一个ConnectNamedPipe。在

技巧是只在管道实际连接时调用DisconnectNamedPipe。每次我试着连接“只是为了确定”时,我都会打电话给它,但它给了我奇怪的错误。在

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

相关问题 更多 >

    热门问题