此图为TCP 4次握手图,当引用层调用close()关闭sockfd时,会发送FIN给对方。默认状况下,Close会当即返回,并由TCP模块负责将发送缓冲区中的残留数据发送出去。应用层没法知道缓冲区中的数据是否成功发送完成。
SO_LINGER 选项能够用来控制调用close函数关闭socket后的行为。 并发
SO_LINGER选项有以下结构: struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */ };
有下列三种状况:
一、设置 l_onoff为0,l_linger的值被忽略,等于内核缺省状况,close调用会当即返回给调用者,TCP模块负责尝试发送残留的缓冲区数据。socket
二、设置 l_onoff为1,l_linger为0,则链接当即终止,TCP将丢弃残留在发送缓冲区中的数据并发送一个RST给对方,而不是一般的四分组终止序列,这避免了TIME_WAIT状态;在远端的recv()调用将以WSAECONNRESET出错。ide
三、设置 l_onoff 为1,l_linger > 0:函数
//使用举例 struct linger so_linger; so_linger.l_onoff = TRUE; so_linger.l_linger = 30; setsockopt(s,SOL_SOCKET,SO_LINGER,&so_linger,sizeof(so_linger));