IdTCPServer擁有公網(wǎng)IP和開放的端口,
IdTCPClient位于NAT之后,沒法端口映射,
但是由IdTCPClient主動(dòng)發(fā)起連接,連接之后互相傳遞文件.
在IdTCPClient的屬性里BoundIP和BoundPort不用填,使用如下代碼就能穿透NAT連接IdTCPServer:
IdTCPClient.Host := ‘0.0.0.0’;//IdTCPServer公網(wǎng)IP
IdTCPClient.Port := 0; //IdTCPServer的端口
try
IdTCPClient.Connect();
except
IdTCPClient.Disconnect;
exit;
end;
要注意的是,IdTCPServer一定要在擁有公網(wǎng)IP的機(jī)子上運(yùn)行,這樣可以使得世界任何地方的電腦用上述代碼就能跟IdTCPServer相連接,連接上后,可以用IdTCPServer的OnConnect取得IdTCPClient經(jīng)過NAT轉(zhuǎn)換后的IP和Port,代碼如下:
procedure TForm1.IdTCPServer1Connect(AThread:TIdPeerThread);
begin
IP := AThread.Connection.Socket.Binding.PeerIP ;
Port := AThread.Connection.Socket.Binding.PeerPort;
end;
使用IdTCPServer的OnConnect獲得的IP和Port才能與IdTCPClient通訊。
你會發(fā)現(xiàn)OnConnect里獲得的IP和Port和未經(jīng)過NAT轉(zhuǎn)換后的IdTCPClient的機(jī)子的IP和Port大不一樣。