我需要在用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
代码正在运行,并没有给出任何错误或异常,但是,映射根本就没有发生。
这是我如何测试它:
我手动将映射条目添加到路由器:
应用程序:HTTP,外部端口8080,内部端口8080,协议:TCP,内部IP,已启用
我在浏览器中请求以下网址: http:// publicIP:externalport /
我删除映射条目并尝试以编程方式添加
浏览器显示以下消息:
无法连接
Firefox无法与服务器建立连接 publicIP:externalPort
我搜索了执行映射的C#代码,它们看起来都一样。 为什么映射会失败? 提前致谢
答案 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 查看您的代码是否真正设置了该路由。