如何判斷socket已經斷開

2021-04-22 17:50:35 字數 743 閱讀 8232

最近在做乙個伺服器端程式,c/s結構。功能方面比較簡單就是client端與server端建立連線,然後傳送訊息給server。我在server端 會使用專門的執行緒處理一條socket連線。這就涉及到乙個問題,如果socket連線斷開(異常,正常)後,我如何才能感知到?server端這邊是絕 對被動的,sever端不能主動斷開連線。也沒有連線鏈路維持包之類的。client端傳送資料的時間也是不定的。在socket連線斷開後, server要能夠感知到並釋放資源。

這個問題在思考測試,詢問同事之後,找到了乙個方法,可以做到這一點。

當使用 select()函式測試乙個socket是否可讀時,如果select()函式返回值為1,且使用recv()函式讀取的資料長度為0 時,就說明該socket已經斷開。

為了更好的判定socket是否斷開,我判斷當recv()返回值小於等於0時,socket連線斷開。但是還需要判斷 errno是否等於 eintr 。如果errno == eintr 則說明recv函式是由於程式接收到訊號後返回的,socket連線還是正常的,不應close掉socket連線。

ps:對於堵塞socket的recv函式會在以下三種情況下返回:

(1)recv到資料時,會返回。

(2)在整個程式接收到訊號時,返回-1。errno = eintr。//在程式的起始階段,遮蔽掉訊號的除外。部分訊號還是遮蔽不掉的。

(3)socket出現問題時,返回-1.具體錯誤碼看 man recv()

(4)一定要看 man 說明,很詳細,很有幫助。

如何判斷Socket是否斷開

socket在連線以後,如果客戶端非正常退出,比如網線掉了 超時退出等,伺服器端的socket仍然有快取,此時可以從該socket描述符中讀出一些資料,短時間內甚至可以寫,因此判斷tcp socket是否斷開及其不易,網上有很多方法,都不能精確判斷。本人用select和recv寫了乙個,在緩衝區被讀...

關於socket判斷連線斷開並重連

關於socket判斷連線斷開並重連 以下是個執行緒函式 uint cmonitordlg threadfunction lpvoid pparam if connect s,struct sockaddr serv1,sizeof serv1 invalid socket else else if ...

如何在C語言中判斷socket是否已經斷開

下面來介紹判斷非阻塞socket是否已經斷開的幾種方法 注意要區分不同作業系統分別進行測試,包括windows,linux和unix會各有不同。在windows下比較簡單,可以使用fd close事件判斷socket是否已經斷開 view plaincopy to clipboardprint?bo...