函数
半关闭的shutdown函数
#include<sys/socket.h>
@param sock:需要断开的套接字文件描述符
@param howto:传递断开方式信息
int shutdown(int sock,int howto);
//成功时返回0,失败返回-1
howto值 | 断开连接方式 |
---|---|
SHUT_RD | 断开输入流 |
SHUT_WR | 断开输出流 |
SHUT_RDWR | 同时断开I/O流 |
注意:howto为SHUT_RDWR时,同时断开I/O流相当于分2次调用shutdown函数,其中一次以SHUT_R为参数,一次以SHUT_WR为参数。
知识点
单方面的断开带来的问题
通信一方调用close或closesocket,可能导致无法接收到另一方刚刚发出的数据。
为解决这一问题,半关闭(Half-close)应运而生,半关闭只关闭一部分数据交换中使用的流,即可传输数据但不能接受,或可接受数据但不能传输。即只关闭流的一半。
套接字和流
两台主机间建立TCP套接字连接,每个主机会拥有单独的输入流和输出流,其中一台的输入流与另一台的输出流相连,输出流与另一台的输入流相连。
而优雅地断开连接方式即每台主机只断开其中一个流而非同时断开两个流。
为何需要半关闭
服务器:
如果调用close函数,它会在被调用同时向对方发送EOF让对方停止发送数据,但也无法再接收到对方在接收到EOF前发送的数据。
而调用shutdown函数,只关闭服务器的输出流,可以发送EOF让对方停止发送数据,也能接收到对方在接收到EOF前发送的数据。