下面來羅列一下判斷遠端已經斷開的方法:
法一:
當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錯誤
法五:
自己實現乙個心跳檢測,一定時間內未收到自定義的心跳包則標記為已斷開。
C TCP 伺服器客戶端Socket程式設計
server.cpp include include using namespace std include define buf size 64 pragma comment lib,ws2 32.lib int main 建立監聽的socket sserver socket af inet,so...
QT 中Socket客戶端與伺服器異常斷開後重連
在現在的專案開發中,經常要使用tcp ip協議來進行通訊,但有時候與伺服器端的鏈結由於網路問題導致連線異常或斷開,這就需要我們的軟體能自動重連,在linux中,我們的思維一般是通過心跳包來監控連線是否斷開,有時候還單獨開乙個執行緒,但是在qt中,就變得簡單多了,當連線異常斷開時,會觸發相應的訊號,我...
伺服器與客戶端
建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...