推送服務器之SO_LINGER參數

推送服務器發送信息後,當即關閉socket。服務器

測試發現有client並無收到信息。查找緣由,找到SO_LINGER參數:socket

當調用closesocket關閉套接字時,SO_LINGER將決定系統如何處理殘存在套接字發送隊列中的數據。處理方式無非兩種:丟棄或者將數據繼續發送至對端,優雅關閉鏈接。事實上,SO_LINGER並不被推薦使用,大多數狀況下咱們推薦使用默認的關閉方式(即下方表格中的第一種狀況)。測試

下方代碼段顯示linger結構語法,表格爲不一樣參數狀況下的套接字行爲。
spa

 
  1. typedef struct linger { 
  2.   u_short l_onoff;    //開關,零或者非零 
  3.   u_short l_linger;   //優雅關閉最長時限 
  4. } linger; 
l_onoff l_linger closesocket行爲 發送隊列 底層行爲
忽略 當即返回。 保持直至發送完成。 系統接管套接字並保證將數據發送至對端。
非零 當即返回。 當即放棄。 直接發送RST包,自身當即復位,不用通過2MSL狀態。對端收到復位錯誤號。
非零 非零 阻塞直到l_linger時間超時或數據發送完成。(套接字必須設置爲阻塞zhuan) 在超時時間段內保持嘗試發送,若超時則當即放棄。 超時則同第二種狀況,若發送完成則皆大歡喜。

可參考的資料:.net

http://msdn.microsoft.com/en-us/library/ms737582(v=VS.85).aspxcode

http://msdn.microsoft.com/en-us/library/ms739165(v=VS.85).aspxorm

http://blog.csdn.net/factor2000/archive/2009/02/23/3929816.aspxblog

相關文章
相關標籤/搜索