【问题标题】:Port Mapping in C# is not workingC# 中的端口映射不起作用
【发布时间】:2012-11-06 04:59:57
【问题描述】:

我需要在用 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 : 外部端口 /

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

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

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

    无法连接

    Firefox 无法与服务器建立连接 公共IP:外部端口

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

【问题讨论】:

  • 您能确认您的测试方法有效吗?例如,创建手动端口转发并测试该端口
  • 这就是我首先做的。手动映射工作正常。

标签: c# upnp portforwarding


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复。考虑 Idea1:在 C# 中,IStaticPortMappingCollection.Add 方法的返回类型是 IStaticPortMapping,它返回的对象似乎没有错误...考虑 Idea2:我找到了我的路由器(它的 URN 以 *:InternetGatewayDevice 结尾)和在它下面有一个名为(Layer3Forwarding)的服务,LANDevice和WANDevice,它们都是版本1,但我发现没有(WANIPConnection)服务!我如何使用 Device Spy 检查我的代码是否设置了路由?再次感谢。
  • 1.我不是在谈论输出参数,而是返回值 2. 设备是分层的:WANDevice/WanConnectionDevice/WANIPConnection。您正在寻找PortMappingNumberOfEntries,然后是GetGenericPortMappingEntry。您也可以尝试AddPortMapping,因为这是您的代码必须使用的。
  • IStaticPortMapping m = mappings.Add(ExternalPort, Protocol, InternalPort, LocalIP, true, Description) ;这行代码来自项目:codeproject.com/Articles/110338/… ...我运行了该项目。没有错误,也没有效果(映射似乎没有发生)
  • 好的,剩下的就是 Idea 2
猜你喜欢
  • 2017-12-08
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多