---------来源于网络视频整理:
TCP链接中A发送FIN请求关闭,B端回应ACK后,A端进入FIN_WAIT_2状态,进入半关闭状态。
此时A可以接收B发送的数据,但是A不能再向B发送数据。
close函数会实现半关闭,但有时候存在一些情况,close()不足以实现半关闭,
比如使用dup2函数,实现有2个文件描述符指向同一个套接字,此时调用close(fd);只close了一个文件描述符连接(通过fd不能写入数据,只能读数据),但,此时,还有另一个文件描述符指向该socket,还可以通过这个文件描述符进行读写。这就不是真正意义半关闭,此时就要使用shutdown函数了
ps:当只有一个文件描述符指向socket时,使用close和shutdown效果是一样的。
使用shutdown比close的优势是,可以仅关闭读,仅关闭写,关闭读写,情况更加精细。同时,当出现多个文件描述符指向同一socket时,调用shutdown,可以将所有的指向都断开。
#include <sys/socket.h>
int shutdown(int sockfd,int how);
how包含以下三种情况:
SHUT_RD(0)
SHUT_WR(1)
SHUT_RDWR(2)