推送服務器發送信息後,當即關閉socket。服務器
測試發現有client並無收到信息。查找緣由,找到SO_LINGER參數:socket
當調用closesocket關閉套接字時,SO_LINGER將決定系統如何處理殘存在套接字發送隊列中的數據。處理方式無非兩種:丟棄或者將數據繼續發送至對端,優雅關閉鏈接。事實上,SO_LINGER並不被推薦使用,大多數狀況下咱們推薦使用默認的關閉方式(即下方表格中的第一種狀況)。測試
下方代碼段顯示linger結構語法,表格爲不一樣參數狀況下的套接字行爲。
spa
- typedef struct linger {
- u_short l_onoff; //開關,零或者非零
- u_short l_linger; //優雅關閉最長時限
- } 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