1.
如何判斷socket已經斷開 在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 說明,很詳細,很有幫助。
posted on 2009-12-17 23:14
chatler 閱讀(266)
評論(0) 編輯 收藏 引用 所屬分類:
Socket