服務端判斷客戶端斷開的經驗方法

2021-09-24 05:35:13 字數 1241 閱讀 6083

法一:

當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適用於清除死亡時間比...