gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:52 33 4
gpt4 key购买 nike

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

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

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

为了让这个场景起作用,之前我曾经打开家庭路由器上的端口并将它们转发到服务器计算机。在客户端上,我只需要提供正确的 IP 地址和相同的端口即可建立连接。

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

首先我添加这个引用:

enter image description here

然后我告诉路由器我想将哪些端口转发到我的计算机(服务器):

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


编辑:

这里是场景 1 的说明:

enter image description here

这是场景 2 的说明

enter image description here

最佳答案

您正在使用的功能称为 Universal Plug and Play (UPnP)这基本上是一种设备告诉另一个设备如何与之通信的方式。您正在做的是告诉计算机告诉路由器您要转发给它的端口。不幸的是,UPnP 是一种不可路由的协议(protocol),这意味着它不能跨越路由器。所以简短的回答是,如果不手动配置离客户端“最远”的路由器,做你正在尝试的事情不会与多个路由器一起工作。

可能可以用 Internet Gateway Device protocol (IDG) 做点什么但是您必须进行更多研究,而您所针对的图书馆不支持该功能。将此问题发布到 Server Fault你可能会得到更好的答案。 (不要发布你的代码,只是解释你的问题的基础知识,你试图让一台机器使用 UPnP 向路由器注册自己,它正在工作,但你在它前面有另一个你想要自动转发的路由器,也是。)

关于c# - 使用 C# 在复杂网络上添加 NAT UPnP 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224878/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com