TCP連線的心跳包機制

2021-09-10 21:42:33 字數 2513 閱讀 4888

所謂的心跳包就是(探測性的)資料報,之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。

採用tcp連線的c/s模式軟體,連線的雙方在連線空閒狀態時,如果任意一方意外崩潰、宕機、網線斷開或路由器故障,另一方無法得知tcp連線已經失效,除非繼續在此連線上傳送資料導致錯誤返回。很多時候,這不是我們需要的。我們希望伺服器端和客戶端都能及時有效地檢測到連線失效,然後優雅地完成一些清理工作並把錯誤報告給使用者。

其實,要判定掉線,只需要send或者recv一下,如果結果為零,則為掉線。但是,在長連線下,有可能很長一段時間都沒有資料往來。理論上說,這個連線是一直保持連線的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有資料互動的連線給斷掉。在這個時候,就需要我們的心跳包了,用於維持長連線,保活。

總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。

心跳檢測步驟:

1客戶端每隔乙個時間間隔發生乙個探測包給伺服器,同時啟動乙個超時定時器

3伺服器端接收到檢測包,應該回應乙個包

4如果客戶端收到伺服器的應答包,則說明伺服器正常,停止超時定時器

5如果客戶端的超時定時器超時,依然沒有收到應答包,則說明伺服器掛了

//1、設定keepalive     

bool bkeepalive = true;

int nret=::setsockopt(sockclient,sol_socket,so_keepalive,(char*)&bkeepalive,sizeof(bkeepalive));

if(nret!=0)

2、感覺兩小時時間太長可以自行設定方法1

//設定keepalive檢測時間和次數

tcp_keepalive inkeepalive = ; //輸入引數

unsigned long ulinlen = sizeof(tcp_keepalive );

tcp_keepalive outkeepalive = ; //輸出引數

unsigned long uloutlen = sizeof(tcp_keepalive );

unsigned long ulbytesreturn = 0;

//設定socket的keep alive為10秒,並且傳送次數為3次

inkeepalive.onoff = 1;

inkeepalive.keepaliveinterval = 4000; //兩次keepalive探測間的時間間隔

inkeepalive.keepalivetime = 1000; //開始首次keepalive探測前的tcp空閉時間

nret=wsaioctl(sockclient,

sio_keepalive_vals,

(lpvoid)&inkeepalive,

ulinlen,

(lpvoid)&outkeepalive,

uloutlen,

&ulbytesreturn,

null,

null);

if(socket_error == nret)

3、感覺兩小時時間太長可以自行設定方法2

因此我們可以得到

int keepidle = 6;

int keepinterval = 5;

int keepcount = 3;

setsockopt(listenfd, sol_tcp, tcp_keepidle, (void *)&keepidle, sizeof(keepidle));

setsockopt(listenfd, sol_tcp,tcp_keepintvl, (void *)&keepinterval, sizeof(keepinterval));

setsockopt(listenfd,sol_tcp, tcp_keepcnt, (void *)&keepcount, sizeof(keepcount));

參考博文:

心跳包機制

心跳包機制 跳包之所以叫心跳包是因為 它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。在tcp的機制裡面,本身是存在有心跳包的機制的,也就是tcp的選項 so kee...

心跳包機制

之所以叫心跳包是因為 它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。在tcp的機制裡面,本身是存在有心跳包的機制的,也就是tcp的選項 so keepalive。系...

心跳包機制

心跳包之所以叫心跳包是因為 它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。在tcp的機制裡面,本身是存在有心跳包的機制的,也就是tcp的選項 so keepaliv...