UDP端口打开检查

Posted

技术标签:

【中文标题】UDP端口打开检查【英文标题】:UDP port open check 【发布时间】: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; 【参考方案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))范围内的第一个空闲端口的更改

以上是关于UDP端口打开检查的主要内容,如果未能解决你的问题,请参考以下文章

怎样用iptables打开udp端口

怎么打开UDP端口

怎样检测TCP/UDP端口的连通性 netcat udp端口检查

【udp】如何检测UDP端口的连通性

nginx代理udp端口范围

强制路由器保持空闲 UDP 端口打开