Linux的close函数和Windows的closesocket函数意味着完全断开连接。完全断开不仅指无法传输数据,而且也不能接收数据。
2台主机正在进行双向通信,主机A发送完最后的数据后,调用close函数断开了连接,之后主机A无法再接收主机B传输的数据。实际上,是完全无法调用与接收数据相关的函数。
套接字和流
建立套接字后可交换数据状态看做一种流,
一旦两台主机间建立了套接字连接,每个主机就会拥有单独的输人流和输出流。本章讨论的“优雅地断开连接方式”只断开其中1个流,而非同时断开两个流。
优雅断开的shutdown函数
#include<sys/socket.h>
int shutdown(int sock,int howto);
//howto传递断开方式的信息
howto的可能值:SHUT_RD断开输入流,SHUT_WR断开输入流,SHUT_RDWR同时断开I/O流
若向shutdown的第二个参数传递SHUTRD,套接字无法接收数据。即使输入缓冲收到数据也会抹去,而且无法调用输入相关函数。如果SHUT WR,则中断输出流,也就无法传输数据。但如果输出缓冲还留有未传输的数据,则将传递至目标主机。
为何要半关闭
传输文件的服务器端只需连续传输文件数据,而客户端无法知道需要接收数据到何时,客户端无法无休止调用输入函数,因为可能会导致程序阻塞(调用的函数未返回)。约定一个文件尾字符?问题是文件中不能有与约定字符相同的内容。服务器端最后向客户端传递EOF表示文件结束,客户端通过函数返回值接收EOF。服务器断开输出流时向对方传输EOF。