如何使用Windows IOCP API查明对等方是否已断开TCP连接(通过发送RST数据包或类似信息)?具体来说,我无法发送或接收任何数据 - 没有重叠操作正在进行。我只想获得异步通知。有没有办法做到这一点?
答案 0 :(得分:4)
您需要具有读取或写入挂起以检测连接关闭。要么会像Remy在RST上建议的那样返回,但是在有待读取的情况下,您还会收到远程端何时关闭其连接的发送方的通知。
我建议您始终保持重叠的读取待处理,如果您不想占用内存,则可以始终将其作为零字节读取。
答案 1 :(得分:1)
您的IOCP完成处理程序将被通知套接字操作是成功还是失败。参数告诉你是哪种情况。
如果您使用GetQueuedCompletionStatus()
,如果发生任何故障,它将返回FALSE
。如果是套接字故障,*lpOverlapped
将被设置为失败的OVERLAPPED
操作的非NULL指针值。如果GetQueuedCompletionStatus()
本身失败,*lpOverlapped
将设置为NULL。如果对等体正常断开连接,它将返回TRUE并将*lpNumberOfBytes
设置为0。
如果您使用WSAgetOverlappedResult()
,如果发生任何故障,它将返回FALSE。使用WSAGetLastError()
确定它是否是套接字故障。如果对等体正常断开连接,它将返回TRUE并将*lpcbTrasfer
设置为0。