大家好,目前我碰到个棘手的问题,用TIDTCPServer写了一个程序,原理很简单,就是CLIENT 连接到SERVER ,我用的是INDY 9的TIDTCPServer 控件,每次连接上来都是触发OnExecute事件后起一个线程由我程序中进行逻辑处理,现在碰到一个比较头疼的问题,就是因为SOCKET本身是无法知道对方有没有断线,所以如果TIDTCPServer是基于SOCKET话那DISCONNECT其实是只能表示"我已经断开但我仍接收数据"的状态等待握手,我的问题来了:比如说我同一IP作为CLIENT机器第一次正常连接上SERVER后由于网络中断而无法发送DISCONNECT的消息给SERVER,此时SERVER其实是不知道他已经断开,然后我CLIENT有一个TIMER事件就是当断开后会自动重新连接到SERVER,这个时候第2次连上去后,我在SERVER中是用程序去强制DISCONNECT中断前面那个未处理的第一个connection,结果DISCONNECT一做之后,我发现居然第2个连接也无法正常通信了,为了查问题,我检查过CLIENT发起的2个连接是不同的端口,按照我以前用其他语言编写程序的经验来看应该是不会有这样的情况2个其实是独立的连接,是不是INDY控件问题还是什么设置不对,我DELPHI不是很熟,不知道什么原因,请哪位高手帮我指点迷津,谢谢了,分数不够可以加
里面有IdTCPDemo,感觉Client.Disconnect;会向服务端发送一个断开命令!
不管是不是,反正Server能检查Client断开!
type //心跳数据包结构
TCP_KeepAlive = record
OnOff: Cardinal;
KeepAliveTime: Cardinal;
KeepAliveInterval: Cardinal;
end;
.....
var
iVal: TCP_KeepAlive;
....
iVal.OnOff:=1;
iVal.KeepAliveTime:=5000;
iVal.KeepAliveInterval:=5000;
WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@iVal, SizeOf(iVal), nil, 0, @iRet, nil, nil);客户端断开后5秒后服务端就可以知道了。
//如果客户端没有断开那么数据不够时就会堵塞在这儿,不可能if iRet < iNeed then exit;//这就是断开了,如果是客户端主动断开,这里一般就是返回0长度,异常断开可能有点垃圾数//....继续处理......