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