我正在创建一个应用程序,通过tcp连接侦听来自不同应用程序(客户端)的连接(服务器)。因此,如果两个应用程序都位于同一网络上,则很容易建立连接。因此,我试图在服务器上添加一种方法,这样用户就不必在路由器上打开端口,以便在互联网上使用该应用程序时能够正常工作。让我给你们展示几种不同的场景:
1)---------------------------------------------------SCENARIO_1-----------
服务器是房子里的一台计算机。计算机连接到路由器,路由器连接到互联网。客户端是办公室中的一台计算机,它也可以访问互联网。
要使此方案正常工作,在我以前经常打开本地路由器上的端口并将它们转发给服务器计算机之前。在客户机上,为了建立连接,我只需提供正确的IP地址和相同的端口。
现在,我用一种非常酷的技术避免了打开家庭路由器上的端口:
首先,我添加以下引用:

然后,我告诉路由器我希望被转发到我的计算机(服务器):
NATUPNPLib.UPnPNATClass upnpnat;
NATUPNPLib.IStaticPortMappingCollection mappings;
public ServerExample()
{
InitializeComponent();
// server local IP address
mappings.Add(1300, "TCP", 1300, "192.168.0.120", true, "my server");
//.... etc
..在进行此操作时,我可以通过提供端口1300 (服务器计算机的广域网ip地址)连接到我的办公计算机,这是一个不同的端口。(这个地址可以在:whatismyipaddress.com上找到)很酷的是,我不必在路由器上做任何配置!
2)-----------------------------------------------SCENARIO_2
我的问题来了。服务器正好在办公室里。该服务器连接到路由器A,路由器A连接到路由器B,路由器B连接到internet。在另一个例子中,这个示例类似于服务器上的最后一个示例,其中有一个额外的路由器。客户就在别的地方。我们不关心网络设置是如何在客户端计算机上,只要它有互联网访问。
我用来解决这个问题的方法是将包从路由器x转发到服务器计算机,并将流量从路由器B的端口x转发到路由器A的ip地址。在设置配置时,我能够在提供服务器的WAN ip地址时与客户端建立连接。(从办公室网络检索时显示在: whatismyipaddress.com上的ip地址)。
因此,如果我能够避免在路由器上进行所有这些配置,并执行类似的操作,那就太好了:
public delegate void SomeDelegate(string parameters);
NATUPNPLib.UPnPNATClass upnpnat;
NATUPNPLib.IStaticPortMappingCollection mappings;
public ServerExample()
{
InitializeComponent();
// server local IP address
mappings.Add(1300, "TCP", 1300, "192.168.150.141", true, "my server");
mappings.Add(1300, "TCP", 1300, "another ip", true, "router's ip");所以我一直在玩这个游戏,我一直没能让它发挥作用。另外,如果我能够知道服务器连接是否像带有c#的场景1或场景2,或者可能是不同的场景,那么设置服务器的用户就不必指定所有这些信息,那就更好了。例如,我确信limewire也会做类似的事情。
编辑:
下面是场景1说明的情况:

下面是场景2

发布于 2011-08-29 21:22:32
您正在使用的特性称为通用即插即用(UPnP),它基本上是设备告诉另一个设备如何与它通信的一种方式。您正在做的是告诉计算机告诉路由器您想要转发到它的端口。不幸的是,UPnP是一个不可路由的协议,这意味着它不能跳过路由器.因此,简单的回答是,如果不手动配置离客户端“最远”的路由器,那么执行您正在尝试的将不会使与多个路由器一起工作。
使用Internet网关设备协议(IDG)可能是可能的,但您必须进行更多的研究,而您所针对的库并不支持这一点。把这个问题发到服务器故障上,你可能会得到更好的答案。(不要发布您的代码,只需解释问题的基本原理,您正在尝试让一个机器注册到一个使用UPnP的路由器上,该路由器正在工作,但是前面还有另一个路由器,您也想自动转发。)
https://stackoverflow.com/questions/7224878
复制相似问题