一个连接的关闭意味着两个对等点都同意他们不想再互相交流了。如果只有一个对等方关闭了套接字,它只会与FIN通信,它将不再发送任何数据。它还与本地操作系统通信,表示它不再愿意接收任何数据—这里的close(sock)与shutdown(sock,SHUT_WR)不同。 如果客户端关闭或关闭套接字,则对服务器中read的调用将返回0,因为这意味着不再从客户端向服务器发送数据。然后服务器可能会决定关闭或关闭套接字。但也可能决定向客户机发送更多数据,因为服务器中的套接字尚未关闭。如果服务器发送更多的数据,客户端将以RST(连接重置)响应,因为它不需要更多的数据。当接收到RST时,服务器端套接字也会自动关闭。 while ((len = read(sockfd, buf, 256)) > 0){ 在大多数情况下,如果客户端关闭了连接,read将在这里返回0。如果套接字发生错误,它将返回-1,特别是连接重置。如果服务器已将数据写入客户端,而客户端已关闭连接(即争用条件),则可能发生这种情况,在这种情况下,客户端将返回RST。这个错误将在套接字的下一个syscall上传递,即read。