TCP练级的半关闭简而言之就是”关闭连接的一半”(半关闭后只支持传递或接收数据中的一种操作)
套接字和流
两台主机通过套接字建立连接后进入可交换数据的状态(流形参的状态),即将建立套接字后可交换数据的状态看做一种流
套接字的流中,数据只能向一个方向移动,因此需要两个流进行双向通信(建立连接后的主机将拥有单独的输入流与输出流这两个相互独立的流,这两个流与连接上的另一个主机的输出流与输入流形相连),半关闭就是指关闭其中一个方向的流
Linux系统下的close函数与windows下的closesocket函数被调用后是完全的断开连接,即同时关闭了输入流与输出流,这也导致不能再发送数据也不能再接收数据
半关闭实现函数
Int shutdown(int sock, int howto);
Linux中:
成功返回0,失败返回-1
参数一需要断开的套接字的文件描述符
参数二断开方式,可取值
SHUT_RD 断开输入流 SHUT_WR断开输出流 SHUT_RDWR同时断开输入与输出流
Windows中:
成功返回0,失败返回SOCKET_ERROR
参数二可取值:
SD_RECEIVE 断开输入流 SD_SEND断开输出流 SD_BOTH同时断开输入与输出流
断开输出流:套接字无法传输数据ÿ
套接字和流
两台主机通过套接字建立连接后进入可交换数据的状态(流形参的状态),即将建立套接字后可交换数据的状态看做一种流
套接字的流中,数据只能向一个方向移动,因此需要两个流进行双向通信(建立连接后的主机将拥有单独的输入流与输出流这两个相互独立的流,这两个流与连接上的另一个主机的输出流与输入流形相连),半关闭就是指关闭其中一个方向的流
Linux系统下的close函数与windows下的closesocket函数被调用后是完全的断开连接,即同时关闭了输入流与输出流,这也导致不能再发送数据也不能再接收数据
半关闭实现函数
Int shutdown(int sock, int howto);
Linux中:
成功返回0,失败返回-1
参数一需要断开的套接字的文件描述符
参数二断开方式,可取值
SHUT_RD 断开输入流 SHUT_WR断开输出流 SHUT_RDWR同时断开输入与输出流
Windows中:
成功返回0,失败返回SOCKET_ERROR
参数二可取值:
SD_RECEIVE 断开输入流 SD_SEND断开输出流 SD_BOTH同时断开输入与输出流
断开结果
断开输入流:套接字将无法接受数据,即使输入缓冲收到数据也会抹去,且无法调用输入相关函数,断开输出流:套接字无法传输数据ÿ