使用 WSARecv() 和 IOCP 时如何知道套接字何时收到 FIN 数据包?

How to know when the socket has received a FIN packet when using WSARecv() and IOCP?

当使用阻塞套接字和recv()函数时,当套接字收到FIN数据包时,recv()将return 0.

但是,在使用WSARecv()和IOCP时,如何知道套接字何时收到FIN包?我认为 lpNumberOfBytesRecvd 也会设置为 0,但我不确定。

如果 WSARecv() 呼叫在 FIN 到达时正在进行,那么您将成功完成 lpNumberOfBytesRecvd 设置为 0。

如果 WSARecv() 调用是在 FIN 到达之后启动的,那么您可能会从 WSARecv() 调用中收到 WSAESHUTDOWN 错误。

当我得到第一个 'client close'(即零字节读取 return)时,我倾向于在套接字上发出 shutdown(s, SD_RECEIVE),因为这会给出上述可预测的行为并避免通过 IOCP 进行后续尝试接收...