因此在 linux 上,shutdown() 可以使用参数 SHUT_RD、SHUT_WR 或 SHUT_RDWR 来仅关闭部分通信 channel 。但就发送到对等方的 TCP 消息而言,它是如何工作的?
在 TCP 状态机中,关闭以 4 次握手方式进行,
(1) (2)
FIN---------->
<----------ACK
<----------FIN
ACK----------->
那么当我关闭(sock,SHUT_RD)或关闭(sock,SHUT_WR)时它会发送什么消息?
最佳答案
shutdown(sd, SHUT_WR)
发送 FIN,对等方用 ACK 响应。任何进一步写入套接字的尝试都会导致错误。但是对端仍然可以继续发送数据。shutdown(sd, SHUT_RD)
在网络上不发送任何内容:它只是调节本地 API 以返回 EOS 以供套接字上的任何后续读取。在为读取而关闭的套接字上接收数据时的行为是系统相关的:Unix 将确认并丢弃它; Linux 将确认它并对其进行缓冲,这最终将使发送方停止; Windows 将发出 RST,发送方将其视为“对等方重置连接”。
关于Linux:套接字关闭()与关闭(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740852/