Delphi: TCP Hole Punching

Я пытаюсь сделать TCP Hole Punching в Delphi. У меня открыт только один порт - 10000 (для тестирования).

Вот фрагмент моего кода ( полный исходный код):

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 ответ

Попробуйте установить высокое значение TIdTCPClient.ConnectTimeoutкак 5000 или более (миллисекунды).

Другие вопросы по тегам