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 или более (миллисекунды).