UDP端口开放检查

9

如何检查本机的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; - marbel82
1个回答

26
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?
    }

1
:-) 很不错,虽然不是我想要的,但它是下一个最好的选择。肯定能胜任,测试过了,而且工作正常 :-) 谢谢。 - Thomas
从.NET 4开始,此方法适用于IP v4和IP v6。然而,在所有旧的.NET版本中,仅适用于IP v4,即.NET 2.0/3.0/3.5,如果您熟悉如何解释MSDN文档。 - Lex Li
如果有多个读取器,应该使用> 0比较。 - Mare Infinitus
谢谢,它有效。这是我的改进:var isInUsed = IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(p => p.Port == 7525); - Peter Liang
1
这是一个修改版,它返回范围内第一个可用的端口Enumerable.Range(5000, 6000).First(p => !IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(l => l.Port == p)) - aL3891
1
我只想说谢谢你的回答,对我非常有帮助。 - iman_sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接