从Indy的IdTCPServer获取很多“读取超时”异常

问题描述 投票:0回答:1

“读取超时”异常在50%的连接请求的ReadBytes(B1,600,False)处引发,在ReadBytes(B3,5,False)发生20%异常。因此,只有少数几个连接正确完成。我知道在客户端生成600字节的过程不会超过2秒。顺便说一句,如果我将ReadTimeout从10000增加到20000,则结果没有任何改善。大约有50个客户端通常在一天中的不同时间进行连接,因此我们没有拥挤的服务器。设置ReadTimeout的目的是在出现一些问题时尽快关闭连接。我的代码是否有问题,还是应该在其他地方搜索该问题?

procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
  Log: TConnectionLog;
  B1, B2, B3: TIdBytes;
begin
  try
    try
      Log := TConnectionLog.Create;
      Log.ConnectDateTime := Now;
      Log.ClientIP := AContext.Binding.PeerIP;

      AContext.Connection.IOHandler.ReadTimeout := 10000; 
      AContext.Connection.IOHandler.ReadBytes(B1, 600, False);
      AContext.Connection.IOHandler.ReadTimeout := IdTimeoutDefault;
      Log.Bytes600ReceiveDateTime := Now;

      SetLength(B2, 200);
      AContext.Connection.IOHandler.Write(B2);
      Log.Bytes200SendDateTime := Now;

      AContext.Connection.IOHandler.ReadTimeout := 15000; 
      AContext.Connection.IOHandler.ReadBytes(B3, 5, False);
      AContext.Connection.IOHandler.ReadTimeout := IdTimeoutDefault;
      Log.Bytes5ReceiveDateTime := Now;
    except
      on E: Exception do
      begin
        Log.ExceptionMessage := E.Message;
        raise;
      end;
    end;
  finally
    TThread.Synchronize(nil,
      procedure
      begin
        SaveLog(Log);
      end);
    Log.Free;
  end;
end;

Delphi 10.2;印第10.6.2;网络类型:2G / GPRS

delphi tcp indy gprs
1个回答
0
投票

根据雷米·勒博(Remy Lebeau)的指导,我做了很多天的网络流量监控,发现问题出在网络质量低下,在这种情况下,大小大于100字节的TCP段通常会丢失!

© www.soinside.com 2019 - 2024. All rights reserved.