各位大哥:
    请教一个困扰了小弟好久的一个问题:在服务器端使用IdTCPServer的时候,当客户端非正常断开连接(比如:杀死程序)时,IdTCPServer不能触发OnDisconnect事件,Socket线程依然还存在,过了一个晚上来看还没有释放。但是当我的客户端再次连接上来时,该老的Socket线程又会立刻释放掉。请问有什么好的方法能够比较实时的检测到Socket已经断掉了呢?    我们的这个程序在国内跑是没有碰到什么问题的,可是前段时间在国外演示时,一天下来开了上百个Socket线程不能释放掉。很可能是他们的网络不好造成的,但是奇怪为什么Socket断掉了线程还不自动释放呢?    请高手指点迷津!

解决方案 »

  1.   

    (*
    我觉得不用发送检测包,因为如果网络有问题(如:拔掉网线、禁用网卡、强行关闭)都会导致服务器端的读写异常,在这时只须捕获异常并调用善后处理函数即可。
    在你的IdTCPServer的Execute中使用以下结构试试。
    *)
      with AThread,Connection do
      begin
        try
          //收、发操作
        except
          on E:Exception do
          begin
            Disconnect;
            Terminate;
          end;
        end;
      end;
      

  2.   

    异常处理机制是有的,可是在某些情况下就是不发生异常。我也问过borland新闻组的人,他们也认为发心跳包是最保险的检测Socket断开的方法。
      

  3.   

    一般如果网络有问题(如:拔掉网线、禁用网卡、强行关闭)都会导致服务器端的读写(无论是超时或者Socket Handle失效)异常,这点是可以肯定的,在这时置断开状态同时激发OnDisconnect事件,并终止线程,我想应该没问题,我作了测试,无论是拔网线、杀死进程都会执行OnDisconnect,并且终止线程。 
    假如网络故障,即使你使用检测包知道网络有问题,但找出无效连接也是一件麻烦的事。