终止网络连接的通常方法是调用close函数。不过close函数有两个限制,却可以使用shotdown函数来避免:
1、close函数把描述符的引用计数减1, 仅在该计数器变为0时才关闭套接字。使用shutdown函数可以不管引用计数就激发TCP的正常连接终止序列。
2、close终止读和写两个方向的数据传。既然TCP是全双工的,有时候我们需要告知对方我们已经发送完数据,即使对方还有数据需要发送给我们。
#include
int shutdown( int sockfd, int howto);
返回:若成功返回0,出错返回-1
该函数的行为依赖于参数howoto的值:
SHUT_RD 关闭连接读的这一半——套接字中不再有数据可接收,而且套接字缓冲区的现有数据会被丢弃。进程不能再对这样的套接字调用任何读 函数。对于这样的套接字,对端所发的任何数据都会被确认,但是会悄然丢弃。
SHUT_WR 关闭连接写得这一半——对于TCP套接字这也称为半关闭(half-close),当前套接字发送缓冲区中的数据将会被发送,后跟TCP正常的连接终止序列。不管套接字描述符的引用计数是否为0,这样的套接字写半部都照样关闭,进程不能再对这样的套接字进行写操作。
SHUT_RDWR 连接的读写都将关闭——这与调用shutdown函数两次相同,第一次调用指定SHUT_RD,第二次调用指定SHUT_WR。
阅读(1353) | 评论(0) | 转发(0) |