linux下socket連接下的心跳機(jī)制
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-02-10 08:32:13 閱讀次數(shù):4607次
1,在長(zhǎng)連接下,有可能很長(zhǎng)1段時(shí)間都沒(méi)有數(shù)據(jù)來(lái)往。
理論上說(shuō),這個(gè)連接是1直保持連接的,但是實(shí)際情況中,如果中間節(jié)點(diǎn)出現(xiàn)甚么故障是難以知道的。
有的節(jié)點(diǎn)(防火墻)會(huì)自動(dòng)把1定時(shí)間以內(nèi)沒(méi)有數(shù)據(jù)交互的連接給斷掉。
在這個(gè)時(shí)候,就需要我們的心跳包了,用于保持長(zhǎng)連接,保活
2,心跳包之所以叫心跳包是由于:它像心跳1樣每隔固定時(shí)間發(fā)1次,以此來(lái)告知服務(wù)器,這個(gè)客戶端還活著。事實(shí)上這是為了保持長(zhǎng)連接,至于這個(gè)包的內(nèi)容,是沒(méi)有甚么特別規(guī)定的,不過(guò)1般都是很小的包,或只包括包頭的1個(gè)空包。心跳包主要也就是用于長(zhǎng)連接的保活和斷線處理。1般的利用下,判定時(shí)間在30⑷0秒比較不錯(cuò)。如果實(shí)在要求高,那就在6⑼秒。
3,下面為封裝好的心跳包函數(shù),加入項(xiàng)目中參數(shù)設(shè)置1下便可
#include <netinet/tcp.h>
//參數(shù)解釋
//fd:網(wǎng)絡(luò)連接描寫(xiě)符
//start:首次心跳偵測(cè)包發(fā)送之間的空閑時(shí)間
//interval:兩次心跳偵測(cè)包之間的間隔時(shí)間
//count:探測(cè)次數(shù),行將幾次探測(cè)失敗判定為T(mén)CP斷開(kāi)
int set_tcp_keepAlive(int fd, int start, int interval, int count)
{
int keepAlive = 1;
if (fd < 0 || start < 0 || interval < 0 || count < 0) return ⑴; //入口參數(shù)檢查 ,編程的好習(xí)慣。
//啟用心跳機(jī)制,如果您想關(guān)閉,將keepAlive置零便可
if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//啟用心跳機(jī)制開(kāi)始到首次心跳偵測(cè)包發(fā)送之間的空閑時(shí)間
if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//兩次心跳偵測(cè)包之間的間隔時(shí)間
if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//探測(cè)次數(shù),行將幾次探測(cè)失敗判定為T(mén)CP斷開(kāi)
if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
return 0;
}
將想設(shè)置的參數(shù)傳入該函數(shù),設(shè)置成功返回0,否則返回⑴。設(shè)置成功以后,可以將fd交給select去監(jiān)聽(tīng)可讀可寫(xiě)事件,如果select檢測(cè)到fd可讀且read返回毛病,1般就可以判定該fd對(duì)應(yīng)的TCP連接已異常斷開(kāi),調(diào)用close函數(shù)將fd關(guān)閉便可。
TCP連接非正常斷開(kāi)的檢測(cè)(KeepAlive探測(cè))
此處的”非正常斷開(kāi)”指TCP連接不是以優(yōu)雅的方式斷開(kāi),如網(wǎng)線故障等物理鏈路的緣由,還有突然主機(jī)斷電等緣由
有兩種方法可以檢測(cè):1.TCP連接雙方定時(shí)發(fā)握手消息 2.利用TCP協(xié)議棧中的KeepAlive探測(cè)
第2種方法簡(jiǎn)單可靠,只需對(duì)TCP連接兩個(gè)Socket設(shè)定KeepAlive探測(cè)。
從而得知連接已失效,客戶端程序便有機(jī)會(huì)及時(shí)履行清除工作、提示用戶或重新連接。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)