首页 > 代码库 > 网络编程Socket之TCP之close/shutdown详解

网络编程Socket之TCP之close/shutdown详解

close

当套接字的引用计数为0的时候才会引发TCP的四分组连接终止序列;

 

shutdown

不用管套接字的引用计数就激发TCP的正常连接终止序列;


这里由一个SO_LINGER套接字选项

struct linger {

     int l_onoff; /* 0 = off, nozero = on */

     int l_linger; /* linger time,POSIX specifies units as seconds */

};


shutdown:SHUT_RD

关闭连接的读这一半,进程不能再对这样的套接字调用任何读操作;

在套接字上不能再发出接收请求,进程仍可往套接字发送数据,套接字接收缓冲区中所有数据被丢弃,再接收到的任何数据由TCP丢弃,对套接字发送缓冲区没有任何影响;


shutdown:SHUT_WR

关闭连接的写这一半,进程不能再对这样的套接字调用任何写操作;

在套接字上不能再发出发送请求,进程仍可从套接字接收数据,套接字发送缓冲区中的内容被发送到对端,后跟正常的TCP连接终止序列(即发送FIN),对套接字接收缓冲区无任何影响;


shutdown:SHUT_RDWR

关闭连接的读和写;


close:l_onoff = 0(默认情况):

在套接字上不能再发出发送或接收请求,套接字发送缓冲区中的内容被发送到对端,如果描述符引用计数变为0,在发送完发送缓冲区的数据后,跟以正常的TCP连接终止序列(即发送FIN),套接字接收缓冲区中的内容被丢弃;


close:l_onoff = 1,l_linger = 0:

在套接字上不能再发出发送或接收请求,如果描述符引用计数变为0,RST被发送到对端,连接的状态被置为CLOSED(没有TIME_WAIT状态),套接字发送缓冲区和接收缓冲区中的内容被丢弃;


close:l_onoff = 1,l_linger  != 0:

在套接字上不能再发出发送或接收请求,套接字发送缓冲区中的内容被发送到对端,如果描述符引用计数变为0,在发送完发送缓冲区的数据后,跟以正常的TCP连接终止序列(即发送FIN),套接字接收缓冲区中的内容被丢弃,如果在连接变为CLOSED状态前延滞时间到,那么close返回EWOULDBLOCK错误;


未完待续... ...


参考:

UNIX Network ProgrammingVolume 1, Third Edition: TheSockets Networking API


网络编程Socket之TCP之close/shutdown详解