伺服器中判斷客戶端socket斷開連線的方法

2021-07-25 02:11:32 字數 1218 閱讀 3602

下面來羅列一下判斷遠端已經斷開的方法:

法一:

當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...