套接字:如何通过选择检测对等方的关机(SD_RECEIVE)?



当服务器调用shutdown(SD_SEND(时,客户端可以通过select和recv检测到它(返回0(。但是客户端如何检测关机(SD_RECEIVE(?

如果服务器关闭其接收通道,它将无法再接收任何进一步的数据。使用select()无法检测这种情况,只是套接字不再被报告为可写。在这种情况下,没有信号发送到客户端(与关闭发送通道不同,后者发送一个FIN数据包,指示将不再发送数据(。因此,客户端随后发送数据的任何尝试要么在等待服务器确认有接收空间时被无限期缓冲,要么很可能只是因为错误而失败。

简短回答:客户端无法使用神奇的API来检测(Microsoft!(服务器是否调用了关机(SD_RECV(。但是,从客户端到该套接字上的服务器的所有后续发送都将失败。

更长的答案:

  • 关闭(SD_RECV(是Windows的事情。一般来说,它不一定与套接字有关,当然也不与TCP/IP本身有关。没有TCP级别FIN或RST。没有";消息";到客户端。

  • 来自文件:

https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-shutdown

关闭功能不会关闭插座。任何资源在调用closesocket之前,连接到套接字的连接不会被释放。

另一种等待远端发送通知的方法它的所有数据并启动一个优雅的断开使用重叠接收呼叫如下:

  1. 使用how=SD_SEND调用关机
  2. 调用recv或WSARecv,直到函数成功完成并指示收到零个字节。如果返回SOCKET_ ERROR,那么优雅的断开是不可能的
  3. 呼叫插座

最新更新