2017-09-13 16 views
0

私はしようとしていますデルファイの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

、「私は、その内部ポート上で、クライアントに接続しようと、私はエラーを取得接続タイムアウト "

クライアントが既にリダイレクトサーバーとの接続を確立しているため、リモートクライアントは接続するサーバーを見つけることができないという問題があると思います。

+0

私はそれが何であるか分からなかったので、理解するためにTCPホールパンチングを読まなければならなかった。私が正しく理解していれば、両方の側が接続を開こうとしていることに気付きます。**ソケットを持っていると** SYNパケットを送ります**と**オプションのSYN-ACKを期待します。それのために。 –

答えて

0

5000以上(ミリ秒)のような高い値のTIdTCPClient.ConnectTimeoutを設定してください。