如何使用重叠 I/O 检测到命名管道服务器的客户端连接?
Posted
技术标签:
【中文标题】如何使用重叠 I/O 检测到命名管道服务器的客户端连接?【英文标题】:How to detect client connection to a named pipe server using overlapped I/O? 【发布时间】:2010-06-23 19:23:59 【问题描述】:我正在研究使用命名管道的 MSDN 示例:
Named pipe server using overlapped I/O Named pipe client服务器很容易检测到客户端何时断开连接并创建命名管道的实例。但我无法弄清楚服务器如何在客户端发送任何数据之前知道客户端已连接到管道。
服务器能否在客户端发送任何数据之前检测到已连接的客户端?
如果服务器在客户端首先断开自己之前调用DisconnectNamedPipe
,这是否也会断开客户端? 服务器可以在不与客户端协商的情况下断开客户端与管道的连接吗?
【问题讨论】:
通常知道网络连接是否处于活动状态的方法是通过它成功发送数据。知道它已经死亡的方法是当您从发送数据中获得错误返回码(或没有端到端的回复/确认)时。 【参考方案1】:不确定我是否理解挂断。服务器调用 ConnectNamedPipe 以等待客户端连接。无需发送任何数据。也不能发送,在连接客户端之前不能发出 ReadFile。请注意,SDK 示例也使用了它。
如果服务器不正常地断开连接(没有用某种消息通知客户端以便它可以关闭管道的末端),那么客户端将收到一个错误,ERROR_PIPE_NOTCONNECTED(我认为)。几乎没有理由依赖它来正常关闭,当管道服务器进程意外崩溃和烧毁时,您需要做一些合理的事情。
请注意,由于其异步特性,管道很难正确处理。出现实际上不是问题的错误很常见,您需要处理它。我的管道代码处理这些错误:
ConnectNamedPipe:连接竞争时出现 ERROR_PIPE_CONNECTED,忽略 FlushFileBuffers:管道关闭竞争,忽略所有错误 WaitNamedPipe:ERROR_FILE_NOT_FOUND 如果超时过期,则转换为 WAIT_TIMEOUT CreateFile: ERROR_PIPE_BUSY 如果另一个客户端设法先抓取管道,请重复【讨论】:
"服务器调用 ConnectNamedPipe 等待客户端连接。不需要发送数据。"当然。现在客户端连接到管道但没有发送任何东西。管道很忙,另一个客户端(实际上会发送一些数据)无法连接到它。如何删除“静音”客户端以便为其他客户端连接创建新管道? 服务器可以在检测到连接后再次调用ConnectNamedPipe,以允许其他客户端连接。请务必从 CreateNamedPipe 中省略 FILE_FLAG_FIRST_PIPE_INSTANCE。【参考方案2】:当客户端在WaitNamedPipe()
或/和CreateFile()
调用期间收到ERROR_FILE_NOT_FOUND
错误时,服务器无法正常工作。此错误代码表示服务器上没有指定名称的管道。您应该在ConnectNamedPipe()
调用后立即在服务器上创建新管道以避免此问题。
【讨论】:
以上是关于如何使用重叠 I/O 检测到命名管道服务器的客户端连接?的主要内容,如果未能解决你的问题,请参考以下文章