我有一个简单的过程,它使用TIdTCPClient连接到服务器。其目的是尝试到达服务器并阻止线程,直到建立连接。它适用于稳定的互联网连接。问题是,当这个客户端在某些计算机上执行时(所有这些计算机都有缓慢或不稳定的互联网连接,如移动3G或只是在遥远的小城镇),它总是无法连接"连接超时"例外。与此同时,上述计算机运行浏览器,IM客户端等,这些应用程序运行正常。我的服务器应用程序也没有显示新客户端的迹象。
以下是程序:
procedure ConnectToServer;
begin
EnterCriticalSection(CS_Connect);
try
while not Client.Connected do
begin
Log('Connection attempt...');
Client.Port := <port goes here>;
Client.IPVersion := Id_IPv4;
Client.Host := '<ip address here>';
Client.ConnectTimeout := 11500;
try
Client.Connect;
except
on E: Exception do
Log('Exception: ' + E.ToString);
end;
if Client.Connected then
begin
Log('Connected after ' + inttostr(attempts) + ' failed attempts');
Client.IOHandler.WriteLn(MSG_HELLO);
attempts := 0;
exit;
end;
Inc(attempts);
Log('Connection attempt failed');
Sleep( min(attempts * 1000, 50000) );
end;
finally
LeaveCriticalSection(CS_Connect);
end;
end;
答案 0 :(得分:1)
你没有做错任何事(尽管你使用Connected
是多余的)。 Indy使用与其他应用程序使用相同的套接字API。它们都使用相同的底层connect()
函数。所以问题不在于Indy,而在于操作系统本身。由于您的信号较弱,因此当任何给定的连接成功或失败时,它会被击中/未命中。