C#中的端口映射无效

时间:2012-11-17 19:30:38

标签: c# upnp portforwarding

我需要在用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. 我在浏览器中请求以下网址: http:// publicIP:externalport /

  4. 应用程序在内部端口上接收套接字并回复消息。
  5. 我删除映射条目并尝试以编程方式添加

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

      无法连接

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

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

1 个答案:

答案 0 :(得分:0)

创意1 IStaticPortMappingCollection.Add确实有一个返回值,您应该检查错误。

构思2 :您的路由器可能不允许您在UPnP上设置静态路由。

UPnP Developer Tools运行 DeviceSpy 并查找您的路由器。其URN以*:InternetGatewayDevice结尾。在设备下,查找服务WANIPConnection。查找服务名称后面的数字。如果是2,那么你运气不好。 WANIPConnection上的PortMappingLeaseDuration服务说明(可在UPnP website下载)状态:

  

在1.0版中,值0用于创建静态端口   映射。在2.0版中,不再可能创建静态   通过UPnP操作进行端口映射。相反,带外机制是   要求这样做(参见WWW管理,远程管理或本地   管理)。

即使您的WANIPConnection仍然是版本1,您也可以使用 DeviceSpy 查看您的代码是否真正设置了该路由。