本人在做一个邮件服务器,用的是Serversocket,现在出的问题的当客户端异常断开连接的时候,或是异常关机的时候ServerSocket检测不到客户端是否已经断开,而实际上已经是出现在死连接的了,请问各位高手如何可以解决这个问题.帮忙...谢谢...

解决方案 »

  1.   

    客户端断开连接时,应该会触发ClientDisconnect事件。如果没有触发的话,只好采用服务器端自动检查了,可以设置一个定时器每隔一段时间扫描,是否从客户端接收信息,如果没有则强行断开。
      

  2.   

    use heart beaten signal.
      

  3.   

    你可以通过下面的代码去检测
    ServerSocket1.Socket.Connections[n].Connected
      

  4.   

    TOW:YCG_CNH20
       你的方法我试过了,还是不行,你的只能对正常断开的连接起作用,对于异常的断开还是不行,例如网络问题或者是非法关机,他的连接还是存在,是一个死连接来的!
       
      

  5.   

    在socketError里面写,只要出现错误就断开..然后让客户端重连...对于非正常断开犹为有效...
      

  6.   

    设置Socket Server的Timeout,断开超时,自动清除该连接进程
      

  7.   

    TO:Leehuey
       ServerSocket没有此TimeOut此属性.对于此属性你能说的明白些吗?
       请教....
      

  8.   

    procedure TService1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin   //与客户端连接错误即时断开-->大多数是网络故障引起的:如强行结束任务(client程序).网络异常断开等等
      if ErrorCode<>0 then ServerSocket1ClientDisconnect(sender,socket);
      ErrorCode:=0;
    end;
      

  9.   

    TO:phoenixsharp(小星星) 
       假如客户机突然网络异常断开(断电、网线断了之类)的时候,服务器端根本就不会触发ServerSocket1ClientError这个事件的。
       请教中
       请各位网络编程的高手帮忙。。在线等待,急
      

  10.   

    不会吧..俺在做类似这个功能的时候成功地测试过.没有问题地..TCP连接,只要网线拔出或断电均会触发此事件.. 正常断开: ServerSocket1ClientDisconnect ,错误(可能已经断开):ServerSocket1ClientError,你可以在这两个里面综合判断...
      

  11.   

    比较好的方法是用心跳包来判断,多长时间client没有向server发出心跳,就可以定为其client已经下线!
      

  12.   

    同意楼上的。
    异常断开不会触发服务端的任何事件。判断连接状态-
    服务端:定义一个state保存客户端状态,需要两个Timer一个timer1间隔短的设置客户端连接为断开;一个timer2间隔长的判断状态state;(注意保持两个timer的同步;即每当timer2触发时timer1重新启动)
    客户端:定时(这个时间一般比较短)向服务端发消息,服务端收到设state为连接