我正在尝试在Delphi中执行 TCP Hole Punching 。我只打开了一个端口--10000(用于测试目的)。
以下是我的代码片段(full source code):
procedure TFormMain.btnEnableRedirectClick(Sender: TObject);
begin
IdTCPServerRetr.Active:=True;
end;
procedure TFormMain.btnConnectToClientClick(Sender: TObject);
begin
if IdTCPClientRemote.Port = 0 then
ShowMessage('Wait for connection to redirect server...')
else begin
IdTCPClientRemote.Host:=MyIP;
IdTCPClientRemote.Connect;
ShowMessage('S U C C E S S');
end;
end;
procedure TFormMain.btnConnectClick(Sender: TObject);
begin
IdTCPClientLocal.Host:=MyIP;
IdTCPClientLocal.Connect;
ShowMessage('Connected to redirect server!');
end;
procedure TFormMain.btnListenClick(Sender: TObject);
begin
IdTCPServerLocal.DefaultPort:=IdTCPClientLocal.Socket.Binding.Port;
IdTCPServerLocal.Active:=True;
ShowMessage('Local server started!');
end;
procedure TFormMain.IdTCPServerRetrExecute(AContext: TIdContext);
begin
IdTCPClientRemote.Port:=AContext.Connection.Socket.Binding.PeerPort;
end;
首先,我在端口10000上运行远程服务器(用于重定向)。
IdTCPServerRetr.Active:=True;
之后,我连接到重定向服务器(端口10000)并创建本地服务器,使用与客户端相同的端口。
IdTCPClientLocal.Connect; IdTCPServerLocal.DefaultPort:= IdTCPClientLocal.Socket.Binding.Port; IdTCPServerLocal.Active:=True;
(客户端和服务器有 reusesocket = rsTrue )
之后,我尝试连接到客户端,在其内部端口上,但我收到错误“连接超时”。
我认为问题是远程客户端无法找到要连接的服务器,因为客户端已经与重定向服务器建立了连接。
答案 0 :(得分:0)
尝试设置较高的TIdTCPClient.ConnectTimeout
值,例如5000或更多(毫秒)。