close和shutdown

int close(int sockdf);

行为描述:​

1、close引发描述符的引用计数减一,当该计数为0时才会关闭套接字。

2、close会终止读和写两个方向的数据传送,其行为受SO_LINGER属性影响。

(1)若不设置SO_LINGER属性或者关闭SO_LINGER属性其默认行为为:终止读和写两个方向的数据传送,套接字发送缓冲区中的数据将被尝试发送到对端,接收缓冲区中的数据被丢弃,描述符引用计数减一如果减一之后描述符引用计数为0则启动正常的TCP连接终止序列(四次分手)关闭套接字。

​(2)l_onoff为非0,l_linger为0。则终止读和写两个方向的数据传送,接收缓冲区和发送缓冲区中的数据都被丢弃,描述符引用计数减一如果减一之后描述符引用计数为0则发送RST到对端,连接状态直接被置为CLOSED(没有TIME_WAIT状态)。

(3)​l_onoff为非0,l_linger为非0。则终止读和写两个方向的数据传送,套接字发送缓冲区中的数据将被尝试发送到对端,接收缓冲区中的数据被丢弃,描述符引用计数减一如果减一之后描述符引用计数为0则启动正常的TCP连接终止序列(四次分手)关闭套接字。如果在连接变为CLOED状态前延滞时间到,则close返回EWOULDBLOCK错误。

int shutdown(int sockfd,int howto);

行为描述:

其行为依赖于​how参数:SHUT_RD,SHUT_WR,SHUT_RDWR

(1)​SHUT_RD:关闭套接字可读的一半,套接字不再能接收数据,当前接收缓冲区数据被丢弃,但是仍能发送数据。

(2)SHUT_WR:关闭套接字可写的一半,发送缓冲区数据被送到对端,后跟正常的TCP链接终止序列(四次分手),不再能发送数据。仍能接收数据。

(3)​SHUT_RDWR:套接字读写部分都关闭,相当于调用SHUT_RD+SHUT_WR。

posted @ 2016-11-26 14:52  luizp  阅读(235)  评论(0编辑  收藏  举报