从 Indy 的 IdTCPServer 获取大量 "Read timed out" 异常
Getting a lot of "Read timed out" exceptions from Indy's IdTCPServer
"Read timed out" 50% 的连接请求在 ReadBytes(B1, 600, False) 处引发异常,20% 的连接请求在 ReadBytes(B3, 5, False) 处引发异常。所以只有少数连接正确完成。
我知道在客户端生成 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
在Remy Lebeau的指导下,我做了多日的网络流量监控,发现问题是由于网络质量低下引起的,其中大于100字节的TCP段大部分都丢失了时代!
"Read timed out" 50% 的连接请求在 ReadBytes(B1, 600, False) 处引发异常,20% 的连接请求在 ReadBytes(B3, 5, False) 处引发异常。所以只有少数连接正确完成。 我知道在客户端生成 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
在Remy Lebeau的指导下,我做了多日的网络流量监控,发现问题是由于网络质量低下引起的,其中大于100字节的TCP段大部分都丢失了时代!