如何使用重叠I / O检测客户端与命名管道服务器的连接?

时间:2010-06-23 19:23:59

标签: c++ visual-studio-2008 visual-c++ winapi named-pipes

我正在研究使用命名管道的MSDN示例:

服务器可以轻松检测客户端何时断开连接并创建命名管道的实例。但是,在发送来自客户端的任何数据之前,我无法弄清楚服务器如何知道客户端连接到管道。

服务器可以在客户端发送任何数据之前检测到已被发送的客户端吗?

如果服务器在客户端首先断开连接之前调用DisconnectNamedPipe,那么这也会断开客户端的连接吗? 服务器可以在不与客户端协商的情况下断开客户端与管道的连接吗?

2 个答案:

答案 0 :(得分:3)

不确定我理解挂断。服务器调用ConnectNamedPipe以等待客户端连接。无需发送数据。也不能发送,在连接客户端之前不能发出ReadFile。请注意,SDK示例也使用它。

如果服务器断开连接(没有通知客户端某种消息,因此它可以关闭管道的末尾),那么客户端将收到错误ERROR_PIPE_NOTCONNECTED(我认为)。没有理由依赖它进行正常关机,当管道服务器进程崩溃并意外烧毁时,你需要做一些合理的事情。

请注意,由于它们的异步特性,管道很难实现。获得实际上不存在问题的错误很常见,您需要处理它。我的管道代码处理这些错误:

  • 连接竞赛中的ConnectNamedPipe:ERROR_PIPE_CONNECTED,忽略
  • FlushFileBuffers:在管道关闭时竞争,忽略所有错误
  • WaitNamedPipe:ERROR_FILE_NOT_FOUND如果超时过期,则转换为WAIT_TIMEOUT
  • CreateFile:ERROR_PIPE_BUSY如果其他客户端设法先抓住管道,重复

答案 1 :(得分:1)

如果客户在ERROR_FILE_NOT_FOUND或/和WaitNamedPipe()来电期间出现CreateFile()错误,则

服务器无法正常工作。此错误代码表示服务器上没有指定名称的管道。您应该在ConnectNamedPipe()调用后立即在服务器上创建新管道以避免此问题。