#c# #udp #port
#c# #udp #порт
Вопрос:
Каков наилучший способ проверить, открыт UDP-порт или нет на том же компьютере. У меня есть номер порта 7525UDP
, и если он открыт, я хотел бы привязаться к нему. Я использую этот код:
while (true)
{
try {socket.bind()}
catch (Exception ex)
{MessageBox.Show("socket probably in use");}
}
но есть ли указанная функция, которая может проверить, открыт UDP-порт или нет. Также было бы неплохо не перебирать весь набор таблиц для портов UDP.
Комментарии:
1. Если вы хотите открыть пустой порт, вы должны позволить системе выполнить всю работу за вас:
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?
}
Комментарии:
1. 🙂 приятный штрих, хотя это не то, что я искал, но это следующая лучшая вещь. Безусловно, проверенная работа выполняется, и она работает 🙂 спасибо.
2. Начиная с .NET 4, этот метод работает как для IP v4, так и для IP v6. Однако это работает только для IP версии 4 для всех старых. СЕТЕВЫЕ релизы, .NET 2.0/3.0/3.5 если вы знакомы с тем, как интерпретировать документацию MSDN.
3. Думаю, это должно быть
> 0
сравнение в случае нескольких считывателей.4. вот изменение, которое возвращает первый свободный порт в диапазоне
Enumerable.Range(5000, 6000).First(p => !IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(l => l.Port == p))
5. Я просто хочу поблагодарить вас за ваш ответ, это было очень полезно для меня.