delphi 接收心跳包怎麼寫

2021-06-04 00:36:34 字數 1521 閱讀 9328

delphi 接收心跳包怎麼寫

有開發網路應用經歷的人都知道,網路中的接收和傳送資料都是使用windows中的socket進行實現。但是如果此套接字已經斷開,那傳送資料和接收資料的時候就一定會有問題。可是如何判斷這個套接字是否還可以使用呢? 

有人一定想到使用send函式中的返回結果來進行判斷。如果返回的長度和自己傳送出去的長度一致,那就說明這個套接字是可用的,否則此套接字一定出現了問題。但是我們並不是無時無刻的傳送資料呀。如何解決呢? 

其實tcp中已經為我們實現了乙個叫做心跳的機制。如果你設定了心跳,那tcp就會在一定的時間(比如你設定的是3秒鐘)內傳送你設定的次數的心跳(比如說2次),並且此資訊不會影響你自己定義的協議。 

在vc中實現心跳的例子很多,可是在dlephi中一直沒有相應的**。下面我是我使用delphi編寫的關於心跳的**(以iocp為例),希望對大家有幫助。 

定義心跳常量 

const 

ioc_in =$80000000; 

ioc_vendor =$18000000; 

ioc_out =$40000000; 

sio_keepalive_vals =ioc_in or ioc_vendor or 4; 

var 

inkeepalive,outkeepalive:ttcp_keepalive; 

實現**是在acceptsc:= wsaaccept(listensc, nil, nil, nil, 0);**的後面加入: 

opt:=1; 

if setsockopt(acceptsc,sol_socket,so_keepalive,@opt,sizeof(opt))=socket_error then 

begin 

closesocket(acceptsc); 

end; 

inkeepalive.onoff:=1; 

//設定3秒鐘時間間隔 

inkeepalive.keepalivetime:=3000; 

//設定每3秒中傳送1次的心跳 

inkeepalive.keepaliveinterval:=1; 

insize:=sizeof(ttcp_keepalive); 

outsize:=sizeof(ttcp_keepalive); 

if wsaioctl(accept,sio_keepalive_vals,@inkeepalive,insize,@outkeepalive,outsize,@outbyte,nil,nil)=socket_error then 

begin 

closesocket(acceptsc); 

end; 

如果加入以上的**以後,系統會每3秒中加入一次的心跳。並且如果客戶端斷線以後(網線斷),函式getqueuedcompletionstatus會返回false。 

begin 

//在這裡處理客戶端斷線資訊。 

continue; 

end; 

以上就是我使用心跳的方法,此方法我已經在我的網路遊戲中使用。情況穩定! 

心跳包實現

class program catch exception ex string msg 其實我在潛水,請不要拋棄我 發往伺服器 networkstream streamtoserver cline.getstream byte bstring encoding.unicode.getbytes ms...

心跳包技術

心跳機制是定時傳送乙個自定義的結構體 心跳包 讓對方知道自己還活著,以確保連線的有效性的機制 從字面意思上來看,我們可以知道,它其實在檢測socket是否斷開的環境下有很大作用,我們就不用擔心socket會因為不正常掉線而使得自己的資料丟失了,接下來我們就好好來看看它到底該如何去用 心跳檢測步驟 1...

網路心跳包處理

以前在學習socket程式設計時都只是簡單的呼叫微軟的api函式,很少考慮網路的異常處理。在做實際的專案中網路異常是必須要考慮到的。網路斷開掉線異常處理 heartbeat 網路心跳包 一下是個人理解,網路心跳包的處理方式有兩種 方式一 終端主動發起,伺服器記錄各個終端最後乙個包的時間點,然後定時掃...