Linux:socket close()vs shutdown()

wei*_*wei 9 linux tcp

因此在linux上,shutdown()可以使用参数SHUT_RD,SHUT_WR或SHUT_RDWR来仅关闭部分通信通道.但就发送给对等体的TCP消息而言,它是如何工作的?

在TCP状态机中,关闭以4次握手的方式工作,

(1)           (2)
FIN---------->

   <----------ACK
   <----------FIN

ACK----------->
Run Code Online (Sandbox Code Playgroud)

那么当我关机(袜子,SHUT_RD)或关机(袜子,SHUT_WR)时它会发送什么消息?

use*_*421 16

  1. shutdown(sd, SHUT_WR)发送一个FIN,对等端用ACK响应.任何进一步尝试写入套接字都会导致错误.但是,对等体仍然可以继续发送数据.

  2. shutdown(sd, SHUT_RD)在网络上不发送任何内容:它只是条件本地API为套接字上的任何后续读取返回EOS.在已关闭以进行读取的套接字上接收数据时的行为与系统有关:Unix将对其进行确认并将其丢弃; Linux将确认它并缓冲它,这最终将阻止发送方; Windows将发出RST,发件人将其视为"通过对等方重置连接".