私はしようとしていますデルファイのTCPホールパンチ。私は1つのポートしかオープンしていません - 10000(テスト目的のため)。ここでデルファイ:TCP穴あけ
は私のコードのスニペット(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)
、「私は、その内部ポート上で、クライアントに接続しようと、私はエラーを取得接続タイムアウト "
クライアントが既にリダイレクトサーバーとの接続を確立しているため、リモートクライアントは接続するサーバーを見つけることができないという問題があると思います。
私はそれが何であるか分からなかったので、理解するためにTCPホールパンチングを読まなければならなかった。私が正しく理解していれば、両方の側が接続を開こうとしていることに気付きます。**ソケットを持っていると** SYNパケットを送ります**と**オプションのSYN-ACKを期待します。それのために。 –