使用阻塞套接字和recv()
函数时,当套接字收到FIN数据包时,recv()
将返回0
。
但是,在使用WSARecv()
和IOCP时,如何知道套接字何时收到FIN数据包?我认为lpNumberOfBytesRecvd
也会设置为0
,但我不确定。
答案 0 :(得分:1)
如果在WSARecv()
到达时FIN
来电正在进行中,那么您将成功完成lpNumberOfBytesRecvd
设为0。
如果在WSARecv()
到达后启动了FIN
来电,则WSAESHUTDOWN
来电可能会出现WSARecv()
错误。
当我得到第一个'客户端关闭'(即零字节读取返回)时,我倾向于在套接字上发出shutdown(s, SD_RECEIVE)
,因为这样可以提供上面的可预测行为,并避免在后续尝试中通过IOCP跳转接受......