【问题标题】:Check if port can be mapped with upnp检查端口是否可以用 upnp 映射
【发布时间】:2014-08-21 12:02:33
【问题描述】:

我在 C# 中有一个函数可以找到一个打开的端口:

    var listener = new TcpListener(IPAddress.Loopback, 0);
        listener.Start();
        int port = ((IPEndPoint)listener.LocalEndpoint).Port;
        listener.Stop();

        return port;

是否可以在我打开该端口后检查该端口是否可以使用 UPnP 映射?因为我即将尝试转发它,我想提前知道它是否会失败。

【问题讨论】:

  • 什么意思,可以转发
  • @AndrewBarber Upnp 端口映射
  • 你是怎么做到的?我没有从你的回答中得到任何反馈。

标签: c# networking port portforwarding upnp


【解决方案1】:

是的,你当然可以,但是我必须警告你,不幸的是,许多家庭互联网路由器和网关对 UPnP 协议的实现很差,而且它并不总是能很好地工作。这很糟糕,但这就是我们生活的世界。:)

如何使用 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 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2011-05-20
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多