若設定了so_linger(亦即linger結構中的l_onoff域設為非零,參見2.4,4.1.7和4.1.21各節),並設定了零超時間隔,則closesocket()不被阻塞立即執行,不論是否有排隊資料未傳送或未被確認。這種關閉方式稱為「強制」或「失效」關閉,因為套介面的虛電路立即被復位,且丟失了未傳送的資料。在遠端的recv()呼叫將以wsaeconnreset出錯。
若設定了so_linger並確定了非零的超時間隔,則closesocket()呼叫阻塞程序,直到所剩資料傳送完畢或超時。這種關閉稱為「優雅的」關閉。請注意如果套介面置為非阻塞且so_linger設為非零超時,則closesocket()呼叫將以wsaewouldblock錯誤返回。
若在乙個流類套介面上設定了so_dontlinger(也就是說將linger結構的l_onoff域設為零;參見2.4,4.1.7,4.1.21節),則closesocket()呼叫立即返回。但是,如果可能,排隊的資料將在套介面關閉前傳送。請注意,在這種情況下windows套介面實現將在一段不確定的時間內保留套介面以及其他資源,這對於想用所以套介面的應用程式來說有一定影響(time_wait)。
這是網上的解釋
主要是影響close socket時的動作
SO LINGER選項解釋
so linger作用 設定函式close 關閉tcp連線時的行為。預設close 的行為是,如果有資料殘留在socket傳送緩衝區中則系統將繼續傳送這些資料給對方,等待被確認,然後返回。利用此選項,可以將此預設行為設定為以下兩種 a.立即關閉該連線,通過傳送rst分組 而不是用正常的fin ack...
慎用TCP的選項SO LINGER
最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於 time wait 狀態,justin 這個流氓的自己承認測試用例寫的有問題,在 recv 函式返回 0 後,沒有 close 控制代碼。我很鬱悶 google 了一下如何處理這類錯誤,發現了 so...
慎用TCP的選項SO LINGER
最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於time wait狀態,justin這個流氓的自己承認測試用例寫的有問題,在recv函式返回0後,沒有close控制代碼。我很鬱悶google了一下如何處理這類錯誤,發現了so linger這個選項,...