【问题标题】:UDP port open checkUDP端口打开检查
【发布时间】:2011-08-18 06:53:13
【问题描述】:

检查 UDP 端口是否在同一台计算机上打开的最佳方法是什么。我有端口号7525UDP,如果它是开放的,我想绑定到它。我正在使用此代码:

while (true) 
{ 

  try {socket.bind()}

  catch (Exception ex) 

  {MessageBox.Show("socket probably in use");}
}

但是是否有指定的函数可以检查 UDP 端口是否打开。不扫描 UDP 端口的整个表集也很好。

【问题讨论】:

  • 如果你想打开空端口,你应该让系统为你工作:var udp = new UdpClient(0); int port = ((IPEndPoint)udp.Client.LocalEndPoint).Port;

标签: c# udp port


【解决方案1】:
int myport = 7525;
bool alreadyinuse = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(p => p.Port == myport);

下面的评论建议了一种变体,它将提供第一个空闲的 UDP 端口……但是,建议的代码效率低下,因为它多次调用外部程序集(取决于正在使用的端口数)。这是一个更有效的变体,它只会调用一次外部程序集(并且也更具可读性):

    var startingAtPort = 5000;
    var maxNumberOfPortsToCheck = 500;
    var range = Enumerable.Range(startingAtPort, maxNumberOfPortsToCheck);
    var portsInUse = 
        from p in range
            join used in System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()
                on p equals used.Port
                    select p;

    var FirstFreeUDPPortInRange = range.Except(portsInUse).FirstOrDefault();

    if(FirstFreeUDPPortInRange > 0)
    {
         // do stuff
         Console.WriteLine(FirstFreeUDPPortInRange);
    } else {
         // complain about lack of free ports?
    }

【讨论】:

  • :-) 触感不错,虽然这不是我想要的,但它是下一个最好的东西。当然,这项工作是否经过测试并且正在发挥作用:-) 谢谢。
  • 从 .NET 4 开始,此方法适用于 IP v4 和 IP v6。但是,如果您熟悉如何解释 MSDN 文档,它仅适用于所有旧 .NET 版本的 IP v4、.NET 2.0/3.0/3.5。
  • 认为它应该是一个> 0 比较,以防有多个读者。
  • 谢谢,它有效。这是我的改进:var isInUsed = IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(p => p.Port == 7525);
  • 这是一个返回Enumerable.Range(5000, 6000).First(p => !IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(l => l.Port == p))范围内的第一个空闲端口的更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多