C#中的端口映射不起作用
我需要在用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
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:
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。