Windows 有没有办法检测客户端管道';使用NamedPipe时是否关闭了s句柄?

Windows 有没有办法检测客户端管道';使用NamedPipe时是否关闭了s句柄?,windows,winapi,pipe,Windows,Winapi,Pipe,我想知道是否有一种方法可以在Windows平台上从服务器端检测客户端管道句柄的状态 即使客户端使用CloseHandle()函数关闭管道(断开连接),似乎也无法从服务器端检测到它 使用带有句柄对象的WaitForSingleObject()返回WAIT\u object\u 0,而不管客户端句柄的状态如何。那么,从服务器端以较低的成本检测客户端管道的句柄是否关闭的好解决方案是什么呢?如果您正在从管道读取数据(pipe\u-ACCESS\u-INBOUND或pipe\u-ACCESS\u-DUPL

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

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


使用带有句柄对象的
WaitForSingleObject()
返回
WAIT\u object\u 0
,而不管客户端句柄的状态如何。那么,从服务器端以较低的成本检测客户端管道的句柄是否关闭的好解决方案是什么呢?

如果您正在从管道读取数据(
pipe\u-ACCESS\u-INBOUND
pipe\u-ACCESS\u-DUPLEX
),当客户端关闭管道末端时,您将得到
错误\u-break\u-pipe
。即使您还没有准备好处理来自管道的数据,您也可以开始提前读取它(使用异步I/O),以便检测管道何时损坏

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

我不知道有什么方法可以检测到客户端关闭了一个只出站的管道,而没有向其写入数据。最好的选择可能是使用
PIPE\u ACCESS\u DUPLEX
,即使管道的引入侧仅用于检测管道何时损坏


作为将来的参考,尽管句柄可以用作同步对象,但不建议这样做,据我所知,唯一受支持的用途是在未指定事件对象的情况下检测异步I/O操作的完成。

如果您正在从管道读取数据(
PIPE\u ACCESS\u INBOUND
PIPE\u DUPLEX
)当客户端关闭其管道末端时,您将收到
ERROR\u breaked\u PIPE
。即使您尚未准备好处理来自管道的数据,您也可以提前开始读取(使用异步I/O)以检测管道何时损坏

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

我不知道有什么方法可以检测到客户端在没有向其写入数据的情况下关闭了仅出站的管道。最好的选择可能是使用
pipe\u ACCESS\u DUPLEX
,即使管道的传入端仅用于检测管道何时断开


作为将来的参考,尽管句柄可以用作同步对象,但不建议这样做,据我所知,唯一受支持的用途是在未指定事件对象的情况下检测异步I/O操作的完成。

再次感谢您。我只是想检查客户端的句柄以检查(当前)连接状态,因为客户端会定期关闭和打开(CreateFile)管道句柄。我正在使用异步I/O和管道\u访问\u双工,但我认为这对于此目的可能并不重要。因此,您的意思是尝试从管道读取数据是一种解决方案?是的,如果您发出读取请求并正在等待数据,则请求将失败(错误为\u断开\u管道)只要客户端关闭其管道末端。再次感谢您。我只想检查客户端的句柄以检查(当前)连接状态,因为客户端关闭并打开(CreateFile)定期处理管道。我正在使用异步I/O和管道访问双工,但我认为这对于此目的可能并不重要。因此,您的意思是尝试从管道读取数据可能是一种解决方案?是的,如果您发出读取请求并等待数据,则请求将失败(错误为管道断开)一旦客户关闭管道末端。