我想知道是否有一种方法可以在 Windows 平台上从服务器端检测客户端管道句柄的状态。
即使客户端使用CloseHandle()
功能关闭了管道(断开连接),似乎也无法从服务器端检测到它。
与句柄对象一起使用会WaitForSingleObject()
返回WAIT_OBJECT_0
,无论客户端句柄的状态如何。那么,从服务器端检测客户端管道的句柄是否以较低的成本关闭的好解决方案是什么?
如果您正在从管道 (PIPE_ACCESS_INBOUND
或PIPE_ACCESS_DUPLEX
) 读取数据,您将ERROR_BROKEN_PIPE
在客户端关闭管道末端时得到。即使您还没有准备好处理来自管道的数据,您也可以提前开始读取它(使用异步 I/O),以便检测管道何时损坏。
请注意,如果管道的客户端有多个句柄,则只有在关闭它的最后一个句柄时才会认为它已关闭。这可能是一个问题,例如,如果客户端无意中导致子进程继承句柄的副本。
我不知道有什么方法可以检测到客户端关闭了仅出站管道而不向其写入数据。最好的选择可能是使用PIPE_ACCESS_DUPLEX
即使管道的入口侧仅用于检测管道何时破裂。
为了将来参考,虽然句柄可以用作同步对象,但不建议这样做,据我所知,唯一支持的用途是检测未指定事件对象的异步 I/O 操作的完成。