Ⅰ 伺服器怎麼判斷心跳包
設置個心跳時間,超過1分鍾仍然沒有更新的,就讓腳本跑成離線就可以了
腳本自動執行,1分鍾一次
操作一次,就觸發一次資料庫記錄,插入資料庫,然後判斷資料庫該欄位是否有值
Ⅱ 什麼是TCP/IP通訊中的心跳包
心跳包就是在客戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
心跳包在GPRS通信和CDMA通信的應用方面使用非常廣泛。數據網關會定時清理沒有數據的路由,心跳包通常設定在30-40秒之間。
所謂的心跳包就是客戶端定時發送簡單的信息給伺服器端告訴它我還在而已。代碼就是每隔幾分鍾發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鍾內沒有收到客戶端信息則視客戶端斷開。
(2)心跳包檢測方法擴展閱讀:
心跳包作用:
在TCP的機制裡面,本身是存在有心跳包的機制的,也就是TCP的選項。系統默認是設置的是2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。
心跳包一般來說都是在邏輯層發送空的包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然後客戶端反饋一個同樣的空包回來,伺服器如果在一定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。只需要send或者recv一下,如果結果為零,則為掉線。
但是,在長連接下,有可能很長一段時間都沒有數據往來。理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有數據交互的連接給斷掉。
Ⅲ 什麼是心跳包!
一般是用來判斷對方(設備,進程或其它網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。一般是用來判斷對方(設備,進程或其它網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。基本原因是伺服器端不能有效的判斷客戶端是否在線也就是說,伺服器無法區分客戶端是長時間在空閑,還是已經掉線的情況.所謂的心跳包就是客戶端定時發送簡單的信息給伺服器端告訴它我還在而已。代碼就是每隔幾分鍾發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鍾內沒有收到客戶端信息則視客戶端斷開。比如有些通信軟體長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。伺服器也可以定時輪詢發心跳下去。一般來說,出於效率的考慮,是由客戶端主動向伺服器端發包,而不是
就是在客戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
就是定時發送給對方一個數據包,告訴對方自己還在維護對話,同時獲得返回的數據,判斷對方是否在會話中。
客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,伺服器收到後,就知道當前客戶端還處於「活著」的狀態,否則,如果隔一定時間未收到這樣的包,則伺服器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。
Ⅳ 如何在socket編程的Tcp連接中實現心跳協議
心跳包的發送,通常有兩種技術
方法1:應用層自己實現的心跳包
由應用程序自己發送心跳包來檢測連接是否正常,大致的方法是:伺服器在一個 Timer事件中定時 向客戶端發送一個短小精悍的數據包,然後啟動一個低級別的線程,在該線程中不斷檢測客戶端的回應, 如果在一定時間內沒有收到客戶端的回應,即認為客戶端已經掉線;同樣,如果客戶端在一定時間內沒 有收到伺服器的心跳包,則認為連接不可用。
方法2:TCP的KeepAlive保活機制
因為要考慮到一個伺服器通常會連接多個客戶端,因此由用戶在應用層自己實現心跳包,代碼較多 且稍顯復雜,而利用TCP/IP協議層為內置的KeepAlive功能來實現心跳功能則簡單得多。 不論是服務端還是客戶端,一方開啟KeepAlive功能後,就會自動在規定時間內向對方發送心跳包, 而另一方在收到心跳包後就會自動回復,以告訴對方我仍然在線。 因為開啟KeepAlive功能需要消耗額外的寬頻和流量,所以TCP協議層默認並不開啟KeepAlive功 能,盡管這微不足道,但在按流量計費的環境下增加了費用,另一方面,KeepAlive設置不合理時可能會 因為短暫的網路波動而斷開健康的TCP連接。並且,默認的KeepAlive超時需要7,200,000 MilliSeconds, 即2小時,探測次數為5次。對於很多服務端應用程序來說,2小時的空閑時間太長。因此,我們需要手工開啟KeepAlive功能並設置合理的KeepAlive參數。
以上轉自網路。
心跳包機制
跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連接,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。
在TCP的機制裡面,本身是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE。系統默認是設置的2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。
心跳包一般來說都是在邏輯層發送空的echo包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然後客戶端反饋一個同樣的空包回來,伺服器如果在一定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。
其實,要判定掉線,只需要send或者recv一下,如果結果為零,則為掉線。但是,在長連接下,有可能很長一段時間都沒有數據往來。理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有數據交互的連接給斷掉。在這個時候,就需要我們的心跳包了,用於維持長連接,保活。
在獲知了斷線之後,伺服器邏輯可能需要做一些事情,比如斷線後的數據清理呀,重新連接呀……當然,這個自然是要由邏輯層根據需求去做了。
總的來說,心跳包主要也就是用於長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
心跳檢測步驟:
1客戶端每隔一個時間間隔發生一個探測包給伺服器
2客戶端發包時啟動一個超時定時器
3伺服器端接收到檢測包,應該回應一個包
4如果客戶機收到伺服器的應答包,則說明伺服器正常,刪除超時定時器
5如果客戶端的超時定時器超時,依然沒有收到應答包,則說明伺服器掛了
轉自:http://blog.sina.com.cn/s/blog_a459dcf5010153m5.html
根據上面的介紹我們可以知道對端以一種非優雅的方式斷開連接的時候,我們可以設置SO_KEEPALIVE屬性使得我們在2小時以後發現對方的TCP連接是否依然存在。
具體操作:
//設置KeepAlive
1、 BOOL bKeepAlive = TRUE;
int nRet=::setsockopt(sockClient,SOL_SOCKET,SO_KEEPALIVE,(char*)&bKeepAlive,sizeof(bKeepAlive));
if(nRet!=0)
{
AfxMessageBox("出錯");
return ;
}
2、感覺兩小時時間太長可以自行設定方法1
//設置KeepAlive檢測時間和次數
tcp_keepalive inKeepAlive = {0}; //輸入參數
unsigned long ulInLen = sizeof(tcp_keepalive );
tcp_keepalive outKeepAlive = {0}; //輸出參數
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)
{
AfxMessageBox("出錯");
return;
}
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));
Ⅳ c# c/s 之間如何做心跳檢測
用SOCKET,然後再看具體網路情況,決定是C端還是S端發起心跳包。
一般會是C端開始工作後主動連接S端,連接成功後每過指定的時間發一個包,包的內容可以很簡單,就一個0。而S端收到後再反一個包。這樣就完成了心跳過程,如果在超出的時間沒有接到客戶端的心跳包,伺服器則斷開客戶端連接,或者做其他操作