终止网络连接一般使用close函数。但是close有两个限制,可以使用shutdown函数来避免
(1)close把描述符的引用计数减一,仅在该计数变为0时才关闭套接字。使用shutdown可以不管引用计数就激发TCP的正常连接终止序列
(2)close终止读和写两个方向的数据传送。有时我们需要通知对端我们已经完成了数据发送,即使对端仍有数据要发送给我们
1: #include<sys/socket.h>2: int shutdown(int sockfd,int howto);3: //返回:成功为0,若出错返回-1
该函数的行为依赖于howto:
SHUT_RD
关闭连接的读这一半——套接字中不再有数据可以接收,而且套接字接收缓冲区中的数据被丢弃
一个TCP套接字这样调用shutdown后,由该套接字接收来自对端的数据将被确认,然后悄然丢弃
SHUT_WR
关闭连接的写这一半——对于TCP套接字,这称为半关闭。当前在套接字发送缓冲区中的数据将被发送,后跟正常的终止序列
SHUT_RDWR
连接的读半部和写半部都关闭