首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用NamedPipe时,有没有办法检测客户端管道的句柄是否关闭?

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

Stack Overflow用户
提问于 2012-06-05 07:36:55
回答 1查看 3.9K关注 0票数 1

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

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

WaitForSingleObject()与handle对象一起使用将返回WAIT_OBJECT_0,而与客户端句柄的状态无关。那么,从服务器端检测客户端管道句柄是否关闭的较好解决方案是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-05 12:01:08

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

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10889805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档