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 網路心跳包 一下是個人理解,網路心跳包的處理方式有兩種 方式一 終端主動發起,伺服器記錄各個終端最後乙個包的時間點,然後定時掃...