gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:19:42 31 4
gpt4 key购买 nike

我正在学习有关命名管道的信息,并且正在使用MSDN文档中的命名管道客户端和服务器示例:

Named Pipe Server

Named Pipe Client

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

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

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

  • 启动服务器
  • 启动客户端
  • 通过客户端发送了一条消息(在此点击了服务器中的断点)
  • 杀死了客户端
  • 单步执行到GetNamedPipeHandleState

  • 对GetNamedPipeHandleState()的调用成功返回,因此我再也不必执行GetLastError()调用。当到达WriteFileEx调用时,它将失败,并且此时对GetLastError的调用将返回ERROR_NO_DATA。

    查看管道功能,我看不到其他可能对您有所帮助的内容。我丢失了某些东西,或者是客户端断开连接只是无法检测到。

    我唯一想到的另一件事是(通过GetNamedPipeClientProcessId)收集连接客户端的pid,并分离看门狗线程以检查它们是否仍然存在。但是,只是考虑这样做会引起我的欺骗感。

    使用命名管道时,是否可以检测到断开连接的客户端?

    最佳答案

    ReadFile()不返回并返回错误,然后GetLastError()然后返回ERROR_BROKEN_PIPE吗?

    关于winapi - 如何使用命名管道客户端/服务器检测客户端断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375320/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com