终止网络连接的正常方法是close,但close有两个限制,可由shutdown来避免
1、close将描述字的访问计数减1,仅在此计数为0时才关闭套接口。用shutdown可以激发TCP的正常连接终止序列,而不管访问计数
2、close终止了数据传送的两个方向:读和写。由于TCP连接是全双工的,有很多时候我们要通知另一端我们已经完成了数据发送,即使那一端仍有许多数据要发送也是如此。
其函数如下:
#include <sys/socket.h>
int shutdown(int sockfd, int howto);
成功返回 0,失败返回-1
该函数的行为依赖于参数howto的值
SHUT_RD:关闭连接的读这一半,不再接收套接口中的数据且现留在套接口接收缓冲区中的数据作废。进程不能再对套接口执行任何读函数。调用此函数后,由TCP套接口接收的任何数据都被确认,但数据本身扔掉
SHUT_WR:关闭连接的写一半,在TCP场合下,这称为半关闭。当前留在套接口发送缓冲区中的数据都被发送,后跟正常的TCP连接终止序列。这个写这一半的关闭不管套接口描述字的访问计数是否大于0的,进程不能再执行对套接口的任何写操作。
SHUT_RDWR:连接的读这一半和写这一半都关闭。这等效于调用 函数shutdown两次,第一次调用时SHUT_RD,第二次用SHUT_WR