【解決方案】
1. 傳送重試,由業務完成。
因為club_l5的send介面不會保留使用者傳送的內容,在recv失敗的情況下,使用者傳送的資料已經丟失,所以只能由業務進行重試。
結論:否定。由於後端伺服器有多台,每次傳送的時候並不能不能保證連線的機器還是上次傳送的那一台伺服器,有可能後端所有的連線都被斷開,雖然失敗比例有所降低,還是不能解決問題。
2. 修改伺服器端關閉連線的等待時間。
治標不治本,可以在緊急情況下使用。
經過和still、allan、robby、steven一起討論,最佳的方案就是在傳送的時候,就能感知到伺服器端已經關閉連線,經過討論,給出以下解決方案:
3. 在send之前對先對read進行selcect,並使用read檢驗連線的狀態。
在send之前先對select函式read進行select,並設定時間引數設為0,select會立即返回,如果有fin包可立刻知道,再進行read,如果read的返回值 <= 0,則說明連線有問題,或接收到了fin包,此時需關閉連線進行重連。
4. 使用poll()函式是否處於pollrdhup(套接字半關閉)狀態。
如果是,則關閉連線進行重連,目前還不完全成熟,且不適用於核心版本較低的系統。
5. 使用系統呼叫getpeername函式加系統錯誤碼的方式檢查對端是否關閉連線。
用法如下:if(getpeername (sock, &addr, &len) < 0 && errno == enotconn) 當此條件成立的時候,說明對端已經關閉連線。
6.
傳送之前用msg_peek的方式recv
。
看recv的返回值是否0位元組,如果是0位元組,說明對方傳送了fin包,已關閉了連線。allan給出ttc中驗證連線是否有效的函式:
綜合集中方案,最好採用6方案
。
自動檢測SOCKET鏈結斷開
如何判斷socket已經斷開 最近在做乙個伺服器端程式,c s結構。功能方面比較簡單就是client端與server端建立連線,然後傳送訊息給server。我在server端會使用專門的執行緒處理一條socket連線。這就涉及到乙個問題,如果socket連線斷開 異常,正常 後,我如何才能感知到?s...
如何判斷Socket是否斷開
socket在連線以後,如果客戶端非正常退出,比如網線掉了 超時退出等,伺服器端的socket仍然有快取,此時可以從該socket描述符中讀出一些資料,短時間內甚至可以寫,因此判斷tcp socket是否斷開及其不易,網上有很多方法,都不能精確判斷。本人用select和recv寫了乙個,在緩衝區被讀...
socket選項自帶的TCP異常斷開檢測
tcp異常斷開是指在突然斷電,直接拔網線等等情況下,如果通訊雙方沒有進行資料傳送通訊等處理的時候,無法獲知連線已經斷開的情況.在通常的情況下,為了使得socket通訊不受作業系統的限制,需要自己在應用層實現心跳包機制,來檢查異常斷開的情況,一般的方式就是伺服器在一段時間沒有收到客戶端資料報時,定時發...