我正在使用java sbbi库来转发端口。 但我的路由器连接到另一台路由器, 所以第一个路由器的外部ip是 第二个路由器dhcp给出的ip。 有没有办法转发第二个路由器上的端口? 这是我的代码:
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);
答案 0 :(得分:4)
正如@Danpe在回答中所说,当你在多个NAT后面时,UPnP不会让你打开端口。
由于我还在研究P2P软件,而且从我收集到的内容中,可以尝试连接两个同行:
如果以上操作不起作用,应用程序要么位于不支持UPnP,NAT-PNP的路由器之后......要么是在多级NAT之后。现在你可以:
与应用程序用户沟通,打开这些路由器上的端口。正如您在评论中提到的那样,这是一个不幸的解决方案,因为它假定用户具有高级技术知识。但它似乎确实是一些公司实际做的事情。例如,请参阅here。
使用中继服务器,例如使用TURN protocol的中继服务器,具有关闭端口的用户将通过该服务器进行通信。此中继服务器可能是端口打开的对等端中的一个或多个(如uTorrent的情况),或者它可以是您的服务器,或两者的组合:如果有开放端口的对等端,请使用这些,否则使用你自己的服务器(这是Skype的情况)。
答案 1 :(得分:3)
据我所知,目前的设置无法实现,因为您无法直接访问路由器的网关。
我能想到两种解决方案。
希望我能提供帮助。