2012-11-17 93 views
2

我需要在C#编写的桌面应用程序进行端口转发端口映射在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 

UPnP是在我的Linksys路由器启用

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

这里是如何我测试它:

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

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

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

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

我删除映射条目,并尝试添加它编程

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

    无法连接

    火狐不能 publicIP建立与服务器的连接:externalPort

我搜索的结果进行映射的C#代码,他们看起来都一样。 为什么映射失败? 在此先感谢

+0

你能确认你的测试方法的工作?例如,创建一个手动portforwarding和测试端口 – DarkSquirrel42

+0

这就是我第一次做的。手动映射工作正常。 – Nina

回答

0

理念1IStaticPortMappingCollection.Add确实有返回值,你应该检查错误。

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

运行DeviceSpyUPnP Developer Tools并寻找您的路由器。其URN截止于*:InternetGatewayDevice。在设备下,查找服务WANIPConnection。查找服务名称后面的数字。如果是2,那么你运气不好。 WANIPConnection服务描述(可下载在UPnP website)在PortMappingLeaseDuration规定:

在释放1。0,值为0用于创建映射的静态端口 。在2.0版中,不再可以通过UPnP动作创建静态的 端口映射。相反,出带外的机制是 要求这样做(参见WWW的管理,远程管理或本地 管理)。

即使你WANIPConnection仍然是1版本,你可以使用DeviceSpy用于查找路由是否真的被你的代码中设置与否。

+0

感谢您的回复。 考虑Idea1:在C#中,IStaticPortMappingCollection.Add方法的返回类型为IStaticPortMapping,并且它返回一个对象,它似乎并不有错误... 考虑Idea2:我发现我的路由器(其金塔*结束:InternetGatewayDevice ),在它下面有一个称为(Layer3Forwarding),LANDevice和WANDevice的服务,它们都是版本1,但我没有找到(WANIPConnection)服务! 如何使用Device Spy来检查路由是否由我的代码设置? 再次感谢。 – Nina

+0

1.我不是在谈论*输出参数* *,但返回值* 2的设备分级:'WANDevice/WanConnectionDevice/WANIPConnection'。你正在寻找'PortMappingNumberOfEntries',然后'GetGenericPortMappingEntry'。你也可以尝试'AddPortMapping',因为这就是你的代码必须使用的。 –

+0

IStaticPortMapping m = mappings.Add(ExternalPort,Protocol,InternalPort,LocalIP,true,Description);这行代码是从项目:http://www.codeproject.com/Articles/110338/UpnpStat-List-and-Modify-Port-Mappings-on-your-UPn ...我跑项目。没有错误,也没有影响(映射似乎没有发生) – Nina