Linux Socket SO_LINGER選項

此圖爲TCP 4次握手圖,當引用層調用close()關閉sockfd時,會發送FIN給對方。默認狀況下,Close會當即返回,並由TCP模塊負責將發送緩衝區中的殘留數據發送出去。應用層沒法知道緩衝區中的數據是否成功發送完成。
SO_LINGER 選項能夠用來控制調用close函數關閉socket後的行爲。 併發

Linux Socket SO_LINGER選項

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:函數

  • 若是socket爲阻塞的,則close將阻塞等待l_linger 秒的時間,若是在l_linger秒時間內,TCP模塊成功發送完殘留的緩衝區數據,則close返回0,表示成功。若是l_linger時間內,TCP模塊沒有成功發送完殘留的緩衝區數據,則close返回-1,表示失敗,並將errno設置爲EWOULDBLOCK。
  • 若是socket爲非阻塞,close當即返回,此時須要根據close返回值以及errno來判斷TCP模塊是否成功發送殘留的緩衝區數據。
//使用舉例
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));
相關文章
相關標籤/搜索