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的方法,我在我的网络游戏中用过。情况稳定!