2012-12-04 579 views
5

我正在使用java sbbi库转发端口。 但我的路由器连接到另一个路由器 ,所以第一个路由器的外部IP是 一个由第二个路由器dhcp给出的IP。 有没有办法在第二个路由器上转发端口? 这里是我的代码:如何通过两级路由器upnp转发端口

InternetGatewayDevice[] devices=InternetGatewayDevice.getDevices(1000); 
System.out.println("Found "+devices.length+" Devices"); 
InternetGatewayDevice dev = devices[ 0 ]; 
System.out.println(dev); 
System.out.println("External IP = " + dev.getExternalIPAddress()); 

System.out.println(dev.addPortMapping("Streamternet", "TCP", null, 1333, 
             "192.168.0.105", 8888, 0)); 

System.out.println("waiting for connection"); 
HTTPServer.main(null); 

回答

2

据我知道这是不可能的,你当前的设置,因为你不能直接访问你的路由器的网关。

有两种解决方案我可以想到。

  1. 停用路由器的DHCP服务器,让他和你将所有从第二个路由器和比你都具有相同的子网,并且您可以访问路由器的每一个得到你的IP地址。
  2. 让另一台PC连接到第二个路由器网络,并使其成为侦听您的命令的服务器,并且此服务器将为您执行UPNP任务。 (这可能需要首先手动设置端口转发)

希望我能帮上忙。

+0

,这是不是一种选择...我正在开发一个软件,我不能告诉我的用户做 – Dima

+0

也许你能帮助我吗? http://stackoverflow.com/questions/16092747/java-sbbi-upnp-cant-find-internet-gateway-device-sometimes – Dima

+0

你如何确定你的用户有一个接一个的路由器? – Danpe

3

正如@Danpe在他的回答中所说的,当你在多个NAT后面时,UPnP不会让你打开端口。

,因为我工作,也对P2P软件,并从我收集的,这里是一个可以尝试连接两个同伴:

  1. 连接使用TCP或UDP hole punching
  2. 如果上述不起作用,则任一方的其中一台路由器使用Symmetric NAT。尝试使用UPnP或NAT-PNP。
  3. 如果上述不起作用,应用程序可能位于不支持UPnP,NAT-PNP的路由器之后,或者您位于多层NAT之后。现在您可以:

    1. 与她需要打开这些路由器上的端口的应用程序的用户进行通信。正如您在评论中提到的那样,这是一个不幸的解决方案,因为它假定用户具有先进的技术知识。但它似乎确实是一些公司实际做的。例如,请参阅here

    2. 使用中继服务器,例如使用TURN protocol的中继服务器,通过该服务器,封闭端口的用户将进行通信。这个中继服务器可能是一个或多个端口处于开放状态的对等设备(如uTorrent的情况),或者它可以是您的服​​务器或两者的组合:如果存在开放端口的对等设备,请使用这些设备,否则使用这些设备你自己的服务器(Skype就是这种情况)。

相关问题