繁体   English   中英

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

[英]Add a NAT UPnP mapping on a complex network using C#

我正在创建一个应用程序,通过tcp连接从不同的应用程序(客户端)侦听连接(服务器)。 因此,如果两个应用程序位于同一网络上,则很容易建立连接。 所以我正在尝试向服务器添加一个方法,以便用户不必在其路由器上打开端口,以便在通过Internet使用时使应用程序正常工作。 那么让我向您展示几个不同的场景:

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来连接我的办公室计算机,该服务器计算机的WAN IP地址是另一个。 (该地址可在以下网站找到:whatismyipaddress.com)冷却是因为我不需要在路由器上进行任何配置!

2)----------------------------------------------- SCENARIO_2 ----------------------------------------------

知道这里是我的问题。 服务器碰巧在办公室。 该服务器连接到路由器A,路由器A连接到路由器B,路由器B连接到互联网。 在其他示例中,这就像服务器上的最后一个示例,其间有一个额外的路由器。 而客户是其他地方。 只要它具有互联网访问权限,我们就不关心客户端计算机上的网络设置。

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

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

    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#或方案2的方案1相似,或者可能是不同的方案,那么设置服务器的用户不必指定所有信息也会很好。 例如,我确信limewire做了类似的事情。


编辑:

这里是方案1说明:

在此输入图像描述

这里是方案2

在此输入图像描述

您正在使用的功能称为通用即插即用(UPnP) ,它基本上是设备告诉其他设备如何与之通信的一种方式。 你正在做的是告诉计算机告诉路由器你想要转发给它的端口。 不幸的是,UPnP是一种不可路由的协议,这意味着它不能跳过路由器。 所以简短的回答是,如果没有手动配置离客户端“最远”的路由器,那么做你正在尝试的东西将不适用于多个路由器。

可能可以使用Internet网关设备协议(IDG)执行某些操作,但您必须进行更多研究,并且您要定位的库不支持该功能。 将此问题发布到Server Fault ,您可能会得到更好的答案。 (不要发布你的代码,只是解释你的问题的基础知识,你试图让一台机器注册自己使用UPnP的路由器工作,但你有另一台路由器,你想要自动转发也是。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM