2

如何使用 Windows IOCP API 确定 TCP 连接是否被对等方(通过发送 RST 数据包或类似方法)断开?具体来说,我无法发送或接收任何数据——没有重叠的操作正在进行。我只想得到一个异步通知。有没有办法做到这一点?

4

2 回答 2

4

您需要有一个读或写挂起来检测连接关闭。两者都将按照 Remy 在 RST 上的建议返回,但在等待读取时,您还将收到远程端何时关闭其连接的发送端的通知。

我建议您始终保持重叠读取待处理,如果您不想占用内存,您可以随时将其设为零字节读取。

于 2012-06-26T21:01:53.847 回答
1

您的 IOCP 完成处理程序将收到套接字操作成功或失败的通知。参数告诉你是哪种情况。

如果您正在使用,如果发生任何故障GetQueuedCompletionStatus(),它将返回。FALSE如果是套接字失败,*lpOverlapped则将失败的OVERLAPPED操作设置为非 NULL 指针值。如果GetQueuedCompletionStatus()本身失败,*lpOverlapped将被设置为NULL。如果对等端正常断开连接,它将返回 TRUE 并设置*lpNumberOfBytes为 0。

如果您正在使用WSAgetOverlappedResult(),如果发生任何故障,它将返回 FALSE。用于WSAGetLastError()确定是否是套接字故障。如果对等端正常断开连接,它将返回 TRUE 并设置*lpcbTrasfer为 0。

于 2012-06-26T18:51:35.633 回答