2

我需要在用 C# 编写的桌面应用程序中执行端口转发

我使用了这段代码:

using System;
using System.Threading;
using NATUPNPLib;

namespace iSpyApplication
{
    public static class NATControl
    {
        public static UPnPNAT NAT = new UPnPNAT();
        private static IStaticPortMappingCollection _mappings;

        public static IStaticPortMappingCollection Mappings
        {
            get
            {
               if (_mappings==null)
               {

                   try
                   {
                       if (NAT.NATEventManager != null)
                        _mappings = NAT.StaticPortMappingCollection;
                   }
                   catch
                   {
                   }
               }

               return _mappings;
            }
         }

        public static bool SetPorts(int wanPort, int lanPort)
        {
           bool b = false;
           int i = 3;
           while (Mappings == null && i > 0)
           {
               Thread.Sleep(2000);
               i--;
           }

           if (Mappings != null)
           {
               try
               {
                   Mappings.Remove(wanPort, "TCP");
               }
               catch (Exception ex)
               {
                   // do something
               }
               try
               {
                   Mappings.Add(wanPort, "TCP", lanPort, internalIP, true, "iSpy");
                   b = true;
               }
               catch (Exception ex)
               {
                   // do something
               }
           }

           return b;

        } // method

  } // class    

} // namespace

在我的 linksys 路由器中启用了 UPnP

代码正在运行并且没有给出任何错误或异常,但是,映射根本没有发生。

这是我测试它的方式:

  1. 我有一个监听内部端口的应用程序,例如 8080。
  2. 我手动将映射条目添加到我的路由器:

    应用程序:HTTP,外部端口 8080,内部端口 8080,协议:TCP,内部 IP,启用

  3. 我在浏览器中请求以下 URL:http://publicIP:externalport/

  4. 应用程序在内部端口上接收到一个套接字并回复一条消息。

我删除映射条目并尝试以编程方式添加它

  1. 相同
  2. 我运行一个执行映射的代码
  3. 相同
  4. 浏览器显示以下消息:

    无法连接

    Firefox 无法在 publicIP:externalPort 建立与服务器的连接

我搜索了执行映射的 C# 代码,它们看起来都一样。为什么映射会失败?提前致谢

4

1 回答 1

0

想法1IStaticPortMappingCollection.Add确实有一个返回值,你应该检查它是否有错误。

想法 2:您的路由器可能不允许您通过 UPnP 设置静态路由。

UPnP 开发人员工具运行DeviceSpy并查找您的路由器。它的 URN 以. 在设备下,寻找 service 。查找服务名称后面的数字。如果是,那你就不走运了。服务描述(可在UPnP 网站上下载)在以下位置声明:*:InternetGatewayDeviceWANIPConnection2WANIPConnectionPortMappingLeaseDuration

在 1.0 版中,值 0 用于创建静态端口映射。在 2.0 版中,不再可以通过 UPnP 操作创建静态端口映射。相反,需要一种带外机制来执行此操作(参见 WWW 管理、远程管理或本地管理)。

即使您WANIPConnection仍然是 version 1,您也可以使用DeviceSpy来确定路线是否真的由您的代码设置。

于 2012-11-18T12:34:07.417 回答