心跳包怎么用,我看不懂

poplarni 2007-05-06 03:16:59
这下面是别人的程序我还是不知道怎么用到我的收发数据的程序里面,没看到procedure,他说以IOCP为例,我都没接触过,才学一个多月,望大侠指教


在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。

if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverlapped(PerIoData), INFINITE) = False) then
begin
//在这里处理客户端断线信息。

   continue;
end;

...全文
830 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjkto 2009-11-09
  • 打赏
  • 举报
回复
mark
xushanfeng 2009-11-07
  • 打赏
  • 举报
回复
GetQueuedCompletionStatus怎么用?
dd_zhouqian 2008-02-13
  • 打赏
  • 举报
回复
//心跳结构
tcp_keepalive = record
onoff: Integer;
keepalivetime: Integer;
keepaliveinterval: Integer;
end;
TTCP_KEEPALIVE = tcp_keepalive;
PTCP_KEEPALIVE = ^tcp_keepalive;
jnspring 2008-02-02
  • 打赏
  • 举报
回复
把代碼加了就是了,TCP從協議層來保證的
fox1999 2008-01-24
  • 打赏
  • 举报
回复
把代碼加了就是了,TCP從協議層來保證的

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧