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