生活随笔
收集整理的這篇文章主要介紹了
linux下socket连接下的心跳机制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1,在長連接下,有可能很長一段時間都沒有數(shù)據(jù)往來。
理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節(jié)點出現(xiàn)什么故障是難以知道的。
有的節(jié)點(防火墻)會自動把一定時間之內(nèi)沒有數(shù)據(jù)交互的連接給斷掉。
在這個時候,就需要我們的心跳包了,用于維持長連接,保活
2,心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發(fā)一次,以此來告訴服務(wù)器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內(nèi)容,是沒有什么特別規(guī)定的,不過一般都是很小的包,或者只包含包頭的一個空包。心跳包主要也就是用于長連接的保活和斷線處理。一般的應(yīng)用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
3,下面為封裝好的心跳包函數(shù),加入項目中參數(shù)設(shè)置一下即可
[cpp] view plain
copy print?
#include?<netinet/tcp.h>???????????????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?-1;???????????????if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive))?==?-1)?????????{?????????????perror("setsockopt");?????????????return?-1;?????????}???????????????if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void?*)&start,sizeof(start))?==?-1)?????????{?????????????perror("setsockopt");?????????????return?-1;?????????}???????????????if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void?*)&interval,sizeof(interval))?==?-1)?????????{?????????????perror("setsockopt");?????????????return?-1;?????????}???????????????if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void?*)&count,sizeof(count))?==?-1)?????????{?????????????perror("setsockopt");?????????????return?-1;?????????}?????????return?0;?????}???
?將想設(shè)置的參數(shù)傳入該函數(shù),設(shè)置成功返回0,否則返回-1。設(shè)置成功以后,可以將fd交給select去監(jiān)聽可讀可寫事件,如果select檢測到fd可讀且read返回錯誤(<0),一般就能判定該fd對應(yīng)的TCP連接已經(jīng)異常斷開,調(diào)用close函數(shù)將fd關(guān)閉即可。
TCP連接非正常斷開的檢測(KeepAlive探測)
此處的”非正常斷開”指TCP連接不是以優(yōu)雅的方式斷開,如網(wǎng)線故障等物理鏈路的原因,還有突然主機(jī)斷電等原因
有兩種方法可以檢測:1.TCP連接雙方定時發(fā)握手消息 2.利用TCP協(xié)議棧中的KeepAlive探測
第二種方法簡單可靠,只需對TCP連接兩個Socket設(shè)定KeepAlive探測。
心跳機(jī)制只是做檢查,并不能處理
從而得知連接已失效,客戶端程序便有機(jī)會及時執(zhí)行清除工作、提醒用戶或重新連接。
總結(jié)
以上是生活随笔為你收集整理的linux下socket连接下的心跳机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。