3

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

1)------------------------------------------------ ---场景_1---------------------------------------------- ---------------

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

为了使这种情况正常工作,在我以前打开家庭路由器上的端口并将它们转发到服务器计算机之前。在客户端上,我只需要提供正确的 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)------------------------------------------------------------------------场景_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:

在此处输入图像描述

这是说明的场景2

在此处输入图像描述

4

1 回答 1

4

您正在使用的功能称为通用即插即用 (UPnP),它基本上是设备告诉另一个设备如何与其通信的一种方式。您正在做的是告诉计算机告诉路由器您希望将哪些端口转发给它。不幸的是,UPnP 是一个不可路由的协议,这意味着它不能跨越路由器。因此,简短的回答是,如果不手动配置离客户端“最远”的路由器,那么您正在尝试的操作将无法与多个路由器一起使用。

可以使用Internet 网关设备协议 (IDG)做一些事情,但必须进行更多研究,而您所针对的库不支持该协议。将此问题发布到服务器故障,您可能会得到更好的答案。(不要发布您的代码,只需解释您的问题的基础知识,即您试图让一台机器使用 UPnP 向路由器注册自身,该路由器正在工作,但您前面有另一个路由器要自动转发, 也。)

于 2011-08-29T21:22:32.943 回答