setsockopt 設置 SO_LINGER 選項併發
此選項指定函數close對面向鏈接的協議如何操做(如TCP)。內核缺省close操做是當即返回,若是有數據殘留在套接口緩衝區中則系統將試着將這些數據發送給對方。函數
SO_LINGER選項用來改變此缺省設置。使用以下結構:spa
struct linger {接口
int l_onoff; /* 0 = off, nozero = on */進程
int l_linger; /* linger time */程序
};im
有下列三種狀況:數據
一、設置 l_onoff爲0,則該選項關閉,l_linger的值被忽略,等於內核缺省狀況,close調用會當即返回給調用者,若是可能將會傳輸任何未發送的數據;協議
二、設置 l_onoff爲非0,l_linger爲0,則套接口關閉時TCP夭折鏈接,TCP將丟棄保留在套接口發送緩衝區中的任何數據併發送一個RST給對方,而不是一般的四分組終止序列,這避免了TIME_WAIT狀態;時間
三、設置 l_onoff 爲非0,l_linger爲非0,當套接口關閉時內核將拖延一段時間(由l_linger決定)。若是套接口緩衝區中仍殘留數據,進程將處於睡眠狀態,直 到(a)全部數據發送完且被對方確認,以後進行正常的終止序列(描述字訪問計數爲0)或(b)延遲時間到。此種狀況下,應用程序檢查close的返回值是很是重要的,若是在數據發送完並被確認前時間到,close將返回EWOULDBLOCK錯誤且套接口發送緩衝區中的任何數據都丟失。close的成功返回僅告訴咱們發送的數據(和FIN)已由對方TCP確認,它並不能告訴咱們對方應用進程是否已讀了數據。若是套接口設爲非阻塞的,它將不等待close完成。