如何判斷socket已經斷開
最近在做乙個伺服器端程式,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 說明,很詳細,很有幫助。
這種方法經過長時間測試後,是有效的。所以寫出來讓大家參考一下,請大家發表意見。
我的方法不一樣,我用getsockopt來判斷,還是蠻準確的
int socketconnected(int sock)else
}
tcp_info和tcp_established在linux/tcp.h
包含#include
#include
#include
#include
#include
#include
int socketconnected(int sock)
else }
shell自動檢測
列印選單,讓使用者選擇,並根據選擇執行操作 如果使用者選擇的是a,顯示cpu資訊 如果使用者選擇的是b,顯示記憶體資訊 如果使用者選擇的是c,執行緒磁碟資訊 如果使用者選擇的是d,顯示網路io資訊 使用者使用者選擇的是e,退出系統 如果使用者選擇成其他選擇,提示輸入錯誤,讓使用者重新選擇 bin b...
spring 自動檢測bean
當在spring配置中增加時,我們希望spring特殊對待我們所定義的bean裡的某一組註解,並使用這些註解指導bean裝配。即使有助於完全消除spring配置中的和元素,我們仍需要使用元素顯示定義bean。但是spring還有另一種技巧。元素除了完成與一樣的工作,還允許spring自動檢測bean...
解除硬碟自動檢測
如果你的電腦不管是正常關機還是非正常關機,啟動時都自動掃瞄檢測硬碟的某個分割槽,說明硬碟出現了問題,可以使用修復軟體進行一下修復。如果硬碟沒有問題,可以考慮關閉硬碟的自動掃瞄檢測。方法有二 1 color darkred 開始 color color darkred 執行 color 輸入 colo...