close和shutdown以及SO_LINGER的聯繫

以下有部分摘自《unix網絡編程》

clsoe將描述字的訪問計數器減1,僅在此計數爲0的時候才,激發TCP的正常連接終止序列,並且關閉套接口。

shutdown我們可以激發TCP的正常連接終止序列,而不管訪問計數。


而close的操作依賴於套接口選項SO_LINGER的值,具體如下:

SO_LINGER選項用來改變此缺省設置。使用如下結構:

struct linger {

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

    int l_linger; /* linger time */

};

 

有下列三種情況:

1、設置l_onoff爲0,則該選項關閉,l_linger的值被忽略,等於內核缺省情況,close調用會立即返回給調用者,如果可能將會傳輸任何未發送的數據;

 

2、設置l_onoff爲非0,l_linger爲0,則套接口關閉時TCP夭折連接,TCP將丟棄保留在套接口發送緩衝區中的任何數據併發送一個RST給對方,而不是通常的四分組終止序列,這避免了TIME_WAIT狀態;

 

3、設置l_onoff 爲非0l_linger爲非0,當套接口關閉時內核將拖延一段時間(由l_linger決定)。如果套接口緩衝區中仍殘留數據,進程將處於睡眠狀態,直 到(a)所有數據發送完且被對方確認,之後進行正常的終止序列(描述字訪問計數爲0)或(b)延遲時間到。此種情況下,應用程序檢查close的返回值是 非常重要的,如果在數據發送完並被確認前時間到,close將返回EWOULDBLOCK錯誤且套接口發送緩衝區中的任何數據都丟失。close的成功返 回僅告訴我們發送的數據(和FIN)已由對方TCP確認,它並不能告訴我們對方應用進程是否已讀了數據。如果套接口設爲非阻塞的,它將不等待close 成。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章