【发布时间】:2020-02-24 11:24:50
【问题描述】:
我正在尝试创建一个程序来打开路由器端口,可能是在 C# 中。我听说可以使用 opennat C# 库。我尝试使用此代码,但程序没有显示答案。
public Form1()
{
InitializeComponent();
OpenPort().Wait();
}
private static async Task OpenPort()
{
var nat = new NatDiscoverer();
var cts = new CancellationTokenSource(5000);
var device = await nat.DiscoverDeviceAsync(PortMapper.Upnp, cts);
await device.CreatePortMapAsync(new Mapping(Protocol.Tcp, 11000, 11000, 0, "port 11000"));
}
【问题讨论】:
-
NAT 不代表
router。 -
不要在 winforms 应用程序中使用
.Wait来等待任务完成,它会死锁。await nat.DiscoverDev...方法很可能已完成,然后一切都陷入僵局,因为您阻止了处理此完成的处理。尝试在构造函数中删除对Wait()的调用,看看会发生什么。 -
此代码查找任何支持 UPNP 的设备。这可能是您的电视、控制台、电话、本地机器或根本没有。然后它将尝试修改该随机设备的 NAT 配置。不是个好主意。
-
我通常使用 Windows System32 文件夹中的 Win32 库 wlanapi 库。源代码可从 www.pinvoke.net 获得。您所指的库对 wlinapi.dll 的调用与 pinvoke 中显示的相同。网络托管库没有实现所有 IP 协议,并且无法修改 c# 代码以添加缺少的协议。您要么需要在 c++ 中进行修改,要么调用 Window dll。