DELPHI网络应用程序,其中主要是两个SERVERSOCKET,一端接受数据,另一端把数据分发出去,程序运行个把星期就死机,禁用网络,无响应的程序又正常,开启网络,数据传输分吧针又死机,再禁用,恢复,数据传输分吧针又死机。
晕死掉了,重启程序,重启电脑的现象也一样,也就是说一旦死机,则至少半小时会反复出现上面的情况,后来又好了。搞了我个吧多月,不知各位有什么建议,请高山不惜赐教,分不够再加。跪求问题原因。

解决方案 »

  1.   

    现在我还没定位到哪一快出问题,做了很多测试,都找不到问题触发的原因,整个应用的代码太多了,程序框架基本为:有两个SERVERSOCKET,前端SERVERSOCKET接受一百多个硬件设备发过来的无线网络数据,另一个SERVERSOCKET把这些数据广播给他的客户端,客户端是三方公司写的。因为他是一段时间才出现一次,现在我急于要找出问题原因,或者测试的方法重现现象的发生。请各位高手给出思路。最讨厌的故障现象就是一但故障发生,重启后,接受数据一两分钟,又死机,反复好几次又可以了,(到底几次不一定),禁用网络,死机恢复。
      

  2.   

    主要还是要测试,建议在程序里面记录好日记,就知道在哪个地方发生错误了,下面提供一个写日记的函数给你,你可以在有可能出错的地方写上跟踪日记
    procedure Tmas.ProcessOutPut(flogstr: string);
    var
      f: TextFile;
      filestr: string;
      FileHandle: integer;
    begin        
      try
        filestr := ExtractFileDir(ParamStr(0))+'\logfiles\'+FormatDateTime('yyyymmdd', now)+'.log';
        if not FileExists(filestr) then
        begin
          FileHandle := FileCreate(filestr);
          FileClose(FileHandle);
        end;
        AssignFile(f, filestr);
        Append(f);
        Writeln(f, formatdatetime('yyyy.mm.dd hh:nn',now)+flogstr);
        { insert code here that would require a Flush before closing the file }
        Flush(f); { ensures that the text was actually written to file }
      finally
        CloseFile(f);
      end;
    end;
      

  3.   

    谢谢你的提示,我检查了程序,没发现这种数据包,同时在程序死机时,CPU,内存都没有升高,CPU几乎为零,内存十几M,
      

  4.   


    谢谢你的提醒,在可能出错的地方我都写有日志,跟踪的日志主要是10053的错误,其他没有,错误片段如下:
    //////////////////////////////////////////////////////////////////
    //------2010-08-09 16:59:46  V1.5.2.5
    //描述:启动系统
    //错误代号:0
    ------2010-08-09 17:00:24  V1.5.2.5
    描述:网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:00:38  V1.5.2.5
    描述:8659116081网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5       ---估计此时死机,我禁用网络,所以都断开了
    描述:8659106332网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659106308网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659116013网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659116052网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659116041网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659106402网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659116130网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659106369网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:02:59  V1.5.2.5
    描述:8659116010网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116058网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106312网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116045网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116023网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116017网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116046网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116060网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106401网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116042网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116044网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116005网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116032网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106559网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106313网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116049网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106366网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116001网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106326网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106385网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116053网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116020网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106372网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659106040网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116037网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
    ------2010-08-09 17:03:00  V1.5.2.5
    描述:8659116075网络错误在TServerWinSocket
    错误代号:eeDisconnect:10053
      

  5.   

    今天用NETSTAT查了下服务器的链接情况,吓了一跳,SQL SERVER的链接居然好几千个,估计第三方程序访问数据库链接没释放引起,现在继续查找看他是否是引起网络程序故障的原因。大家也给我提提意见
      

  6.   

    今天做了15此实验,都出现以上的异常情况,实验如下:
    用实验软件反复用TCP连接数据库而不释放连接(5ms一次),运行通讯软件,一段时间后被测程序死机,段开网络,程序恢复,用NETSTAT察看网络连接情况,死机时有时连接有两千多个,有时有两万多个。实验软件与通讯软件都在同一台记子上。针对以上实验,不知各位有没有过相识的经验以及高超的见解。现在我在联系电脑,让通讯软件单独一台服务器,但问题的具体原因其实还是不明的。望位给予分析与探讨。
      

  7.   

    这种情况,一般是被io阻塞了,如果你的程序是异步的,一般不会出现这种问题。io阻塞原因:1:数据包错误
    2:数据包长度不够。3:程序内部有死循环。检查下这三个地方。
      

  8.   

    我用的是非阻塞的TSERVERSOCKET,IO阻塞应该不会发生吧在ONCLIENTREAD()事件代码如下:
    procedure TfMain.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      RevText:string;
      len:integer;
    begin
    try
      socket.lock;  //此处需不需要用lock,如果用时哪个线程同步,我现在没有使用它
      while Socket.ReceiveLength>0 do
      begin
        RevText:=RevText+Socket.ReceiveText;
      end;  //end while
      TProcessGPRS.DoWXData(RevText,Socket.RemoteAddress,Socket.RemotePort,Socket);//处理socket数据,同时利用了socket.data保存了连接的应用数据
    finally
      socket.unlock;
    end;
    end;
    请问在onClientRead事件中需要用lock吗?tServerSocket是非阻塞的
      

  9.   

    写了一测试程序,服务器程序用tserversocket接受数据,客服程序用socket api写的不停向服务器发数据,没设send超时,当tserversocket服务器sleep(300000)后,客服端在send处阻塞,且服务器休眠结束还是阻塞,设send超时,则send返回-1.请问为什么服务器休眠则客服程会阻塞在send函数处(设超时则返回-1)且休眠结束依然阻塞?
    我的程序就是因为SEND阻塞的,这个问题想了很久也不得答案,请各位赐教
      

  10.   

    如果想用非阻塞的控件,我个人推荐ICS这套控件(开源免费)。