내가하려고하는 것 델파이에서 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가),하지만 난 오류 "연결 시간 제한 ".
클라이언트가 이미 리디렉션 서버와의 연결을 설정했기 때문에 문제가 원격 클라이언트가 연결할 서버를 찾을 수 없다고 생각합니다.
나는 그것이 무엇인지 알지 못 했으므로 TCP 홀 펀치를 읽어야했습니다. 만약 내가 올바르게 이해한다면, 양측이 연결을 시도하고, 소켓을 가지고 ** 둘 다 SYN 패킷을 보내고, ** 선택적인 SYN-ACK를 기대할 때, 나는 Indy가 지원하는지 확신하지 못한다. 그에 대한. –