本章所有示例代码>>github
7.1 基于TCP的半关闭
1. 单方面断开连接带来的问题
Linux的close函数(Windows的closesocket函数)意味着完全断开连接。完全断开连接不仅指无法传输数据,而且也不能接收数据。
主机A发送完最后的数据,调用close函数断开了连接,之后主机A无法再接收主机B传输的数据。最终,由主机B传输的还未到达主机A的数据也销毁了。
“只关闭一部分数据交换中使用的流”(Half-close)的方法应运而生。断开一部分连接是指,可以传输数据但无法接收数据,或可以接收数据但无法传输数据。
2. 套接字和流(Stream)
把建立套接字后可交换数据的状态看作一种流。为了进行双向通信,需要I/O流1、I/O流2两个流。
一旦两台主机间建立了套接字连接,每个主机就会拥有单独的输入流和输出流。本章讨论断开连接时,只断开其中1个流,而非同时断开两个流。
3. 针对优雅断开的shutdown函数
#include<sys/socket.h>
int shutdown(int sock, int howto);
-sock: 需要断开的套接字文件描述符;
-howto: 传递断开方式信息;
SHUT_RD: 断开输入流
SHUT_WR: 断开输出流
SHUT_RD_WR: 同时断开I/O流