如何使用Windows IOCP检测断开连接(RST / FIN)?

时间:2012-06-26 15:41:21

标签: windows sockets disconnect iocp

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

2 个答案:

答案 0 :(得分:4)

您需要具有读取或写入挂起以检测连接关闭。要么会像Remy在RST上建议的那样返回,但是在有待读取的情况下,您还会收到远程端何时关闭其连接的发送方的通知。

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

答案 1 :(得分:1)

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

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

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