一、什么是心跳檢測(cè) 判斷對(duì)方(設(shè)備,進(jìn)程或其它網(wǎng)元)是否正常動(dòng)行,一般采用定時(shí)發(fā)送簡(jiǎn)單的通訊包,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷對(duì)方已經(jīng)當(dāng)?shù)簟S糜跈z測(cè)TCP的異常斷開(kāi)。 基本原因是服務(wù)器端不能有效的判斷客戶端是否在線也就是說(shuō),服務(wù)器無(wú)法區(qū)分客戶端是長(zhǎng)時(shí)間在空閑,還是已經(jīng)掉線的情況。所謂的心跳包就是客戶端定時(shí)發(fā)送簡(jiǎn)單的信息給服務(wù)器端告訴它我還在而已。 代碼就是每隔幾分鐘發(fā)送一個(gè)固定信息給服務(wù)端,服務(wù)端收到后回復(fù)一個(gè)固定信息。如果服務(wù)端幾分鐘內(nèi)沒(méi)有收到客戶端信息則視客戶端斷開(kāi)。比如有些通信軟件長(zhǎng)時(shí)間不使用,要想知道它的狀態(tài)是在線還是離線就需要心跳包,定時(shí)發(fā)包收包。 發(fā)包方可以是客戶也可以是服務(wù)端,看哪邊實(shí)現(xiàn)方便合理。[size=+0]一般是客戶端。服務(wù)器也可以定時(shí)輪詢(xún)發(fā)心跳下去。 一般來(lái)說(shuō),出于效率的考慮,是由客戶端主動(dòng)向服務(wù)器端發(fā)包,而不是相反。 二、關(guān)于Send函數(shù)的返回值 我們知道當(dāng)客戶端以?xún)?yōu)雅的方式斷開(kāi)TCP連接后,服務(wù)器使用Send函數(shù)發(fā)包,得到的返回值為0(說(shuō)明TCP連接已斷開(kāi))。然而,SEND函數(shù)的成功返回只能表示發(fā)送數(shù)據(jù)已經(jīng)進(jìn)入了SOCKET內(nèi)核的發(fā)送隊(duì)列,不一定就已經(jīng)在線上或者已經(jīng)被成功接收了。這可能是因?yàn)閟end只是往發(fā)送緩沖區(qū)拷貝數(shù)據(jù), 剛開(kāi)始緩沖區(qū)還未滿,所以不會(huì)有錯(cuò)誤發(fā)生, 只有等到相當(dāng)一段長(zhǎng)的時(shí)間后, send的返回值才會(huì)為-1。 三、定時(shí)Ping 如果服務(wù)器不能進(jìn)行心跳檢測(cè)的應(yīng)答。可以采用定時(shí)Ping某服務(wù)器來(lái)檢測(cè)TCP連接是否斷開(kāi),如新浪(必須允許Ping的服務(wù)器)。PING是向遠(yuǎn)程主機(jī)發(fā)送一個(gè)ICMP包,如果給定時(shí)間內(nèi)沒(méi)有接收到回應(yīng)就認(rèn)為是超時(shí),如果收到回應(yīng)則分析接收到的ICMP包,得到TTL、類(lèi)型以及用時(shí)。 不過(guò)Ping包有32字節(jié),如果是無(wú)線連接,有時(shí)需要考慮流量問(wèn)題。 |
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |