當調用closesocket關閉套接字時,SO_LINGER將決定系統如何處理殘存在套接字發送隊列中的數據。處理方式無非兩種:丟棄或者將數據繼續發送至對端,優雅關閉連接。事實上,SO_LINGER并不被推薦使用,大多數情況下我們推薦使用默認的關閉方式(即下方表格中的第一種情況)。
下方代碼段顯示linger結構語法,表格為不同參數情況下的套接字行為。

typedef struct linger
{
u_short l_onoff; //開關,零或者非零
u_short l_linger; //優雅關閉最長時限
} linger;
l_onoff |
l_linger |
closesocket行為 |
發送隊列 |
底層行為 |
零 |
忽略 |
立即返回。 |
保持直至發送完成。 |
系統接管套接字并保證將數據發送至對端。 |
非零 |
零 |
立即返回。 |
立即放棄。 |
直接發送RST包,自身立即復位,不用經過2MSL狀態。對端收到復位錯誤號。 |
非零 |
非零 |
阻塞直到l_linger時間超時或數據發送完成。(套接字必須設置為阻塞zhuan) |
在超時時間段內保持嘗試發送,若超時則立即放棄。 |
超時則同第二種情況,若發送完成則皆大歡喜。 |
可參考的資料:
http://msdn.microsoft.com/en-us/library/ms737582(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms739165(v=VS.85).aspx
http://blog.csdn.net/factor2000/archive/2009/02/23/3929816.aspx
本文出自 “一網無垠” 博客,請務必保留此出處http://unliminet.blog.51cto.com/380895/346686