法一:
當recv()返回值小於等於0時,socket連線斷開。但是還需要判斷 errno是否等於 eintr,如果errno == eintr 則說明recv函式是由於程式接收到訊號後返回的,socket連線還是正常的,不應close掉socket連線。
法二:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, ipproto_tcp, tcp_info, &info, (socklen_t *)&len);
if((info.tcpi_state==tcp_established))
//則說明未斷開
else
//斷開
法三:
若使用了select等系統函式,若遠端斷開,則select返回1,recv返回0則斷開。其他注意事項同法一。
法四:
int keepalive = 1; // 開啟keepalive屬性
int keepidle = 60; // 如該連線在60秒內沒有任何資料往來,則進行探測
int keepinterval = 5; // 探測時發包的時間間隔為5 秒
int keepcount = 3; // 探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發.
setsockopt(rs, sol_socket, so_keepalive, (void *)&keepalive, sizeof(keepalive));
setsockopt(rs, sol_tcp, tcp_keepidle, (void*)&keepidle, sizeof(keepidle));
setsockopt(rs, sol_tcp, tcp_keepintvl, (void *)&keepinterval, sizeof(keepinterval));
setsockopt(rs, sol_tcp, tcp_keepcnt, (void *)&keepcount, sizeof(keepcount));
設定後,若斷開,則在使用該socket讀寫時立即失敗,並返回etimedout錯誤
法五:
自己實現乙個心跳檢測,一定時間內未收到自定義的心跳包則標記為已斷開。
JAVA NIO寫服務端判斷客戶端斷開連線的方法
不過這個方法有個問題,就是 1 能偵測到客戶端主動斷開與服務端的連線,但是如果客戶端掉線,服務端就接收不到了。2 如果處於等待狀態,就會出問題。比如說客戶端的資料還沒有準備好傳送,這樣你就已經關閉了鏈結。最近學習nio,一直有個疑問,怎麼知道客戶端斷開了連線.在上網找和試驗之後發現下面的方法可以實現...
JAVA NIO寫服務端判斷客戶端斷開連線的方法
最近學習nio,一直有個疑問,怎麼知道客戶端斷開了連線.在上網找和試驗之後發現下面的方法可以實現這個目的.我們一般會在服務端有個大的while,然後在裡面迴圈判斷是否有客戶端連線 ssc serversocketchannel sk.channel sc ssc.accept system.out....
TCP服務端如何判斷客戶端斷開連線學習
keepalive是很多的tcp實現提供的一種機制,它允許連線在空閒的時候雙方會傳送一些特殊的資料段,並通過響應與否來判斷連線是否還存活著 所謂keep alive 其實keepalive在實際的應用中並不常見。為何如此?這得歸結於keepalive設計的初衷。keepalive適用於清除死亡時間比...