Indy心跳法判断断线的问题
用indy9没多久,遇到一个问题就是如何判断客户端和服务器之间的连接已断,在大富翁论坛找到一个心跳法,如下:
- Delphi(Pascal) code
uses WinSock2;procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);type TCP_KeepAlive = record OnOff: Cardinal; KeepAliveTime: Cardinal; KeepAliveInterval: Cardinal end;var Val: TCP_KeepAlive; Ret: DWord;begin Val.OnOff:=1; Val.KeepAliveTime:=xxx; Val.KeepAliveInterval:=xxx; WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4, @Val, SizeOf(Val), nil, 0, @Ret, nil, nil)end;
将以上代码加到TCPServer的Connect中,原文中提到“应用程序可以在TCPServer的OnException里守着就行了”,加入这个心跳检测后,客户端拔掉网线,未能够检测到SOCKET_ERROR的异常。有人用过这个方法吗,在哪里捕获断线的消息呢?还请指教!
[解决办法]
既然你用了心跳包了,那么超过一定时间不来心跳包那就说明掉线了啊。
[解决办法]
应该有短线的间隔时间
[解决办法]
Indy9的机制不清楚,但是Indy10当中还是需要CheckForDisconnect来检查的,只是有显式和隐式(隐式是指在某些读写操作当中本身的代码已经调用检测过程)