【问题标题】:Is there any way to detect whether client pipe's handle is closed when using NamedPipe?使用 NamedPipe 时,有什么方法可以检测客户端管道的句柄是否关闭?
【发布时间】:2012-06-04 23:36:55
【问题描述】:

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

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

WaitForSingleObject() 与句柄对象一起使用会返回WAIT_OBJECT_0,而不管客户端句柄的状态如何。那么,从服务器端检测客户端管道的句柄是否关闭且成本更低的好解决方案是什么?

【问题讨论】:

    标签: windows winapi pipe


    【解决方案1】:

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

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

    我不知道有什么方法可以检测到客户端关闭了仅出站管道而不向其写入数据。最好的选择可能是使用PIPE_ACCESS_DUPLEX,即使管道的入口侧仅用于检测管道何时破裂。

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

    【讨论】:

    • 这次再次感谢您。我只是想检查客户端的句柄以检查(当前)连接状态,因为客户端会定期关闭并打开(CreateFile)管道句柄。我正在使用异步 I/O 和 PIPE_ACCESS_DUPLEX,但我认为这对于此目的可能并不重要。所以你的意思是尝试从管道中读取数据可以是一个解决方案?
    • 是的,如果您已发出读取请求并正在等待数据,则只要客户端关闭管道末端,请求就会失败(带有 ERROR_BROKEN_PIPE)。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多