德尔福:TCP打孔

时间:2017-09-13 17:34:14

标签: sockets delphi tcp hole-punching

我正在尝试在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

之后,我尝试连接到客户端,在其内部端口上,但我收到错误“连接超时”。

我认为问题是远程客户端无法找到要连接的服务器,因为客户端已经与重定向服务器建立了连接。

1 个答案:

答案 0 :(得分:0)

尝试设置较高的TIdTCPClient.ConnectTimeout值,例如5000或更多(毫秒)。