so_linger作用
設定函式close()關閉tcp連線時的行為。預設close()的行為是,如果有資料殘留在socket傳送緩衝區中則系統將繼續傳送這些資料給對方,等待被確認,然後返回。
利用此選項,可以將此預設行為設定為以下兩種
a.立即關閉該連線,通過傳送rst分組(而不是用正常的fin|ack|fin|ack四個分組)來關閉該連線。至於傳送緩衝區中如果
有未傳送完的資料,則丟棄。主動關閉一方的tcp狀態則跳過timewait,直接進入closed。網上很多人想利用這一點來解決伺服器上出現大量的timewait狀態的socket的問題,但是,這並不是乙個好主意,這種關閉方式的用途並不在這兒,實際用途在於伺服器在應用層的需求。
b.將連線的關閉設定乙個超時。
如果socket傳送緩衝區中仍殘留資料,程序進入睡眠,核心進入定時狀態去盡量去傳送這些資料。
在超時之前,如果所有資料都傳送完且被對方確認,核心
用正常的fin|ack|fin|ack四個分組來關閉該連線
,close()成功返回。
如果超時之時,資料仍然未能成功傳送及被確認,用上述a方式來關閉此連線。
close()返回ewouldblock。
so_linger選項使用如下結構:
struct linger ;
l_onoff為0,則該選項關閉,l_linger的值被忽略,close()用上述預設方式關閉連線。
l_onoff非0,l_linger為0,
close()用上述a方式關閉連線。
l_onoff非0,l_linger非0,
close()用上述b方式關閉連線。
值得一說的是,不管你用什麼方式使用
so_linger
,都需要大量耐心的測試來確保你的伺服器程式確實是按照你的意願在跑,因為這個選項對伺服器處理小量請求的行為影響非常細微,簡單的功能測試很難驗證它的行為,上線後量大的情況下可能會出問題,讓你的伺服器馬上下線,大併發量的模擬實際場景壓測才能保證其正確性。
慎用TCP的選項SO LINGER
最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於 time wait 狀態,justin 這個流氓的自己承認測試用例寫的有問題,在 recv 函式返回 0 後,沒有 close 控制代碼。我很鬱悶 google 了一下如何處理這類錯誤,發現了 so...
SO LINGER選項有何作用?
若設定了so linger 亦即linger結構中的l onoff域設為非零,參見2.4,4.1.7和4.1.21各節 並設定了零超時間隔,則closesocket 不被阻塞立即執行,不論是否有排隊資料未傳送或未被確認。這種關閉方式稱為 強制 或 失效 關閉,因為套介面的虛電路立即被復位,且丟失了未...
慎用TCP的選項SO LINGER
最近有一次效能測試,通訊程式出現錯誤,表現為伺服器處理速度明顯降低,檢查發現伺服器的很多控制代碼出於time wait狀態,justin這個流氓的自己承認測試用例寫的有問題,在recv函式返回0後,沒有close控制代碼。我很鬱悶google了一下如何處理這類錯誤,發現了so linger這個選項,...