关于网络:使用C#在复杂的网络上添加NAT UPnP映射

Add a NAT UPnP mapping on a complex network using C#

我正在创建一个应用程序,该应用程序通过tcp连接侦听来自其他应用程序(客户端)的连接(服务器)。因此,如果两个应用程序都位于同一网络上,则建立连接很容易。因此,我正在尝试向服务器添加一种方法,以便用户不必在路由器上打开端口即可通过互联网使用该应用程序。因此,让我向您展示一些不同的情况:

1)--------------------------------------------- ------ SCENARIO_1 ------------------------------------------- ------------------

服务器是一台房子里的计算机。该计算机已连接到路由器,而该路由器已连接到互联网。客户端是办公室中的一台计算机,也可以访问Internet。

为了使这种情况起作用,在我以前打开家用路由器上的端口并将其转发到服务器计算机之前,请先进行操作。在客户端上,我只需要提供正确的IP地址和相同的端口即可建立连接。

现在,我避免使用一种非常酷的技术来打开家用路由器上的端口:

首先,我添加此引用:

enter

1
2
3
4
5
6
7
8
9
10
11
    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(与之不同的服务器计算机的WAN IP地址)从办公室计算机进行连接。 (该地址可以在:whatismyipaddress.com上找到)。很酷的是,我无需在路由器上进行任何配置!!!

2)--------------------------------------------- --SCENARIO_2 ------------------------------------------------ <铅>

知道这是我的问题。该服务器恰好在办公室。服务器连接到路由器A,路由器A连接到路由器B,路由器B连接到Internet。在其他示例中,该示例类似于服务器上的最后一个示例,中间还有一个额外的路由器。客户在别的地方只要客户端计算机具有Internet访问权限,我们就不会在乎计算机上的网络设置如何。

我用来解决此问题的方法是通过将包从路由器x转发到服务器计算机,还通过端口将流量从路由器B的端口x转发到路由器A的ip地址。在设置该配置时,我能够提供服务器的WAN IP地址时,与客户端建立连接。 (从办公室网络检索时显示在:whatismyipaddress.com上的ip地址)。

因此,如果我可以避免在路由器上进行所有此配置并执行类似以下操作,那将是很好的选择:

1
2
3
4
5
6
7
8
9
10
11
12
    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");

所以我一直在玩这个游戏,但我无法使其正常工作。如果我能确定服务器连接是否类似于方案1(使用c#或方案2)或其他方案(也可以这样),则设置服务器的用户不必指定所有信息,这也很好。例如,我敢肯定,limewire会做类似的事情。

编辑:

这是示例1:

enter


您使用的功能称为通用即插即用(UPnP),这基本上是一种设备告诉另一设备如何与其通信的方法。您正在做的是告诉计算机告诉路由器您要将其转发到哪个端口。不幸的是,UPnP是不可路由的协议,这意味着它不能跨路由器跳转。因此,简短的答案是,如果不手动配置距离客户端"最远"的路由器,则无法在多台路由器上进行尝试。

可能可以使用Internet网关设备协议(IDG)进行某些操作,但是您必须进行更多研究,而目标库不支持该功能。将此问题发布到服务器故障,您可能会得到更好的答案。 (不要发布您的代码,只需说明问题的基本知识,即您正在尝试使用正在运行的UPnP向一台路由器注册一台机器,但是前面还有另一个要自动转发的路由器。也是如此。)