Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的端口映射不起作用_C#_Upnp_Portforwarding - Fatal编程技术网

C#中的端口映射不起作用

C#中的端口映射不起作用,c#,upnp,portforwarding,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 IStaticPortMappi

我需要在用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路由器中启用

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

下面是我如何测试它的:

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

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

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

  • 应用程序在内部端口上接收套接字,并用消息进行回复
  • 我删除映射项并尝试以编程方式添加它

  • 同样的
  • 我运行一个执行映射的代码
  • 同样的
  • 浏览器显示以下消息:

    无法连接

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

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

    创意1
    IStaticPortMappingCollection.Add
    有一个返回值,您应该检查该值是否存在错误

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

    从运行DeviceSpy,然后查找您的路由器。它的URN以
    *:InternetGatewayDevice
    结尾。在设备下,查找服务
    WANIPConnection
    。在服务名称后查找数字。如果是
    2
    ,那么你就不走运了<代码>WANIPC连接服务说明(可在下载)状态位于
    端口映射删除

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


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

    您能确认您的测试方法有效吗?例如,创建一个手动端口转发并测试该端口,这是我首先做的。手动映射工作正常。感谢回复。考虑Idea1:在C#中,IStaticPortMappingCollection.Add方法的返回类型是IStaticPortMapping,它返回的对象似乎没有错误。。。考虑到Idea2:我找到了我的路由器(它的URN以*:InternetGatewayDevice结尾),在它下面有一个名为(Layer3Forwarding)、LANDevice和WandDevice的服务,它们都是版本1,但我没有找到(WaniConnection)服务!如何使用Device Spy检查路由是否由我的代码设置?再次感谢。我说的不是输出参数,而是返回值2。这些设备是分层的:
    WANDevice/WanConnectionDevice/WANIPConnection
    。您要查找的是
    PortMappingNumberOfEntries
    ,然后是
    GetGenericPortMappingEntry
    。您也可以尝试
    AddPortMapping
    ,因为这是您的代码必须使用的。IStaticPortMapping m=mappings.Add(ExternalPort,Protocol,InternalPort,LocalIP,true,Description);这行代码来自项目:。。。我负责这个项目。没有错误,也没有效果(映射似乎没有发生)好的,所以您只剩下想法2。