有没有办法在使用NamedPipe时检测客户端管道的句柄是否已关闭?

时间:2012-06-04 23:36:55

标签: windows winapi pipe

我想知道是否有办法在Windows平台上从服务器端检测客户端管道句柄的状态。

即使客户端使用CloseHandle()函数关闭了管道(已断开连接),似乎也无法从服务器端检测到它。

对句柄对象使用WaitForSingleObject()返回WAIT_OBJECT_0,无论客户端句柄的状态如何。那么,以较低的成本检测客户端管道的句柄是否从服务器端关闭是一个很好的解决方案呢?

1 个答案:

答案 0 :(得分:3)

如果您正在从管道(PIPE_ACCESS_INBOUNDPIPE_ACCESS_DUPLEX)读取数据,当客户端关闭管道末端时,您将获得ERROR_BROKEN_PIPE。即使您还没准备好从管道处理数据,您也可以提前开始读取它(使用异步I / O),以便检测管道何时损坏。

请注意,如果管道的客户端有多个句柄,则只有在关闭它的最后一个句柄时才会将其视为已关闭。这可能是一个问题,例如,如果客户端无意中导致子进程继承句柄的副本。

我不知道有任何方法可以检测到客户端是否已关闭仅出站管道而未向其写入数据。即使管道的进入侧仅用于检测管道何时损坏,最好的选择可能是使用PIPE_ACCESS_DUPLEX

为了将来参考,虽然句柄可以用作同步对象,但是不推荐这样做,据我所知,唯一支持的用途是检测异步I / O操作的完成,其中没有事件对象是指定。