我在C#中有一个找到开放端口的函数:
var listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
int port = ((IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();
return port;
一旦打开该端口,是否有可能检查此端口是否可以与UPnP映射?因为我准备转发它,我想提前知道它是否会失败。
答案 0 :(得分:1)
是的,你当然可以,但是我必须警告你,不幸的是,许多家庭互联网路由器和网关的UPnP协议实施不佳,而且它并不总能很好地工作。它很糟糕,但这就是我们生活的世界。:)
UPnP协议规范非常庞大且复杂,因此我强烈建议您使用框架。有几个很好的开源C#框架可供使用:
我个人推荐 Open.NAT ,因为它有更现代的异步实现。
以下是使用Open.NAT尝试打开或映射UDP端口1600的示例:
public static void Main(string[] args) {
// Setup and initialize Open.NAT:
NatUtility.PortMapper = Upnp; // Search only for Upnp devices
NatUtility.TraceSource.Switch.Level = SourceLevels.Information;
NatUtility.DeviceFound += DeviceFound;
NatUtility.Initialize();
// Start looking for UPnP devices:
NatUtility.StartDiscovery();
while(true) {}
}
// This method is called every time a new UPnP device is found:
private static async void DeviceFound (object sender, DeviceEventArgs args) {
var deviceIP = await device.GetExternalIPAsync();
Console.WriteLine("Found a UPnP device with IP " + deviceIP);
Console.WriteLine("Attempting to map UDP port 1600...");
await device.CreatePortMapAsync(new Mapping(Protocol.Udp, 1600, 1600, 10000, "Open.Nat Testing"));
}
简单!您当然可以做更多事情,例如向路由器询问它当前已映射的所有UPnP端口。您应该查看Open.NAT文档。