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端口打开检查的主要内容,如果未能解决你的问题,请参考以下文章