2012-11-17 76 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