如何使用命名管道客户端/服务器检测客户端断开连接?

Rob*_*ves 9 winapi named-pipes disconnect

我正在学习命名管道,并且正在使用来自MSDN doc的命名管道客户端和服务器示例:

命名管道服务器

命名管道客户端

我修改了客户端,因此我可以在控制台中键入消息并将它们发送到显示消息的服务器并发回回复.本质上我添加了一个循环,它在SetNamedPipeHandleState()调用之后开始并在CloseHandle()调用之前结束(即在循环外发生打开和关闭,所以我在循环中使用相同的管道句柄).

我的问题是,如果我杀了客户端(通过关闭它或通过任务管理器结束它)是否有任何方法让服务器端检测断开连接?

我尝试使用GetNamedPipeHandleState()希望它返回失败,并且对GetLastError()的调用将返回ERROR_PIPE_NOT_CONNECTED,但事实并非如此.由于设置此服务器的方式,我必须在CompletedReadRoutine函数中执行此操作并创建"受控"故障.我做的是,在服务器的CompletedReadRoutine上有一个断点:

  1. 启动了服务器
  2. 启动了客户端
  3. 通过客户端发送消息(点击服务器中的断点)
  4. 杀死了客户
  5. 逐步进入GetNamedPipeHandleState

对GetNamedPipeHandleState()的调用成功返回,因此我从未进行过GetLastError()调用.当它到达WriteFileEx调用时它失败并且在那时对GetLastError的调用返回ERROR_NO_DATA.

看管道功能,我看不到任何可能有用的东西.我遗漏了一些东西,或者客户端断开连接只是检测不到.

我能想到的另一件事是收集连接客户端的pid(通过GetNamedPipeClientProcessId)并关闭看门狗线程以检查它们是否仍然存活.虽然,只是考虑这样做会引发我的蜘蛛般的感觉.

有没有办法在使用命名管道时检测断开连接的客户端?

Len*_*ate 5

ReadFile()返回错误GetLastError()然后返回ERROR_BROKEN_PIPE

  • 我真的不认为那些样本是如何做事的好例子......我个人总是在管道上有一个重叠的读取待处理,这样你应该总是在客户端消失时收到通知. . (3认同)
  • 我有一个类似的问题,其中命名管道服务器使用重叠的I / O,并且线程正在OVERLAPPED结构的Event对象上等待。问题是,当客户端断开连接时,即使在服务器端调用了ReadFile(重叠的I / O),在管道的服务器端也没有信号通知事件。编辑:我试图发布此作为对以前的答案的评论,但无法。 (2认同)