2012-12-04 581 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就是這種情況)。

相關問題