此圖爲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));