2017-09-13 2 views
0

내가하려고하는 것 델파이에서 TCP 홀 펀칭. 하나의 포트 만 열었습니다 - 테스트 목적으로 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를 기대할 때, 나는 Indy가 지원하는지 확신하지 못한다. 그에 대한. –

답변

0

5000 이상의 값 (밀리 초)과 같은 높은 값인 TIdTCPClient.ConnectTimeout을 설정하십시오.

관련 문제