Проверка открытого порта UDP - PullRequest
8 голосов
/ 04 мая 2011

Как лучше всего проверить, открыт ли порт UDP или нет на той же машине. У меня есть номер порта 7525UDP, и если он открыт, я бы хотел привязать к нему. Я использую этот код:

while (true) 
{ 

  try {socket.bind()}

  catch (Exception ex) 

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

но есть ли указанная функция, которая может проверить, открыт порт UDP или нет. Без подметания всего набора таблиц для портов UDP было бы также хорошо.

1 Ответ

20 голосов
/ 04 мая 2011
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?
    }
...