Delphi接收心跳包。

让我给你转发一篇文章。

定义心跳常数

常数

IOC _ IN = 80000000美元;

IOC _ VENDOR = $ 18000000;

IOC _ out = 40000000美元;

SIO_KEEPALIVE_VALS =IOC_IN或IOC_VENDOR或4;

定义变量

inKeepAlive,out KEEPALIVE:TTCP _ KEEPALIVE;

实现代码在acceptsc: = wsaaccept (ListNSC,nil,nil,nil,0);在代码后,添加:

opt:= 1;

如果setsockopt(Acceptsc,SOL_SOCKET,SO_KEEPALIVE,@opt,sizeof(opt))=SOCKET_ERROR那么

开始

close socket(Acceptsc);

结束;

inkeepalive . onoff:= 1;

//设置3秒的间隔。

inkeepalive . keepalivetime:= 3000;

//设置为每3秒发送1个心跳。

inkeepalive . keepaliveinterval:= 1;

insize:= sizeof(TTCP _ KEEPALIVE);

特大号:= sizeof(TTCP _ KEEPALIVE);

如果WSAIoctl(Accept,SIO_KEEPALIVE_VALS,@inKeepAlive,insize,@outKeepAlive,outsize,@outByte,nil,nil)=SOCKET_ERROR那么

开始

close socket(Acceptsc);

结束;

如果添加以上代码,系统会每3秒添加一次心跳。而如果客户端断开连接(网线断了),函数GetQueuedCompletionStatus将返回FALSE。

if(GetQueuedCompletionStatus(completion port,BytesTransferred,DWORD(PerHandleData),POverlapped(PerIoData),INFINITE) = False)然后

开始

//在这里处理客户端断开信息。

继续;

结束;

以上是我使用heartbeat的方法,我在我的网络游戏中用过。情况稳定!