2011-05-04 21 views
8

Cuál es la mejor manera de verificar si el puerto UDP está abierto o no en la misma máquina. Tengo el número de puerto 7525UDP y, si está abierto, me gustaría vincularlo. Estoy utilizando este código:Verificación abierta del puerto UDP

while (true) 
{ 

    try {socket.bind()} 

    catch (Exception ex) 

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

pero ¿hay una función específica que se puede comprobar si el puerto UDP está abierta o no. Sin barrer todo el conjunto de tablas para puertos UDP también sería bueno.

Respuesta

18
int myport = 7525; 
bool alreadyinuse = (from p in System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners() where p.Port == myport select p).Count() == 1; 

un comentario más abajo sugiere una variación que suministrar el primer puerto UDP libre ... sin embargo, el código sugerido es ineficiente, ya que llama a los de montaje externo varias veces (dependiendo de cuántos puertos están en uso) Aquí hay una variación más eficiente que sólo llamará al ensamblado externo una vez (y también es más fácil de leer):

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? 
    } 
+0

:-) toque agradable, aunque no es lo que estaba buscando, pero es la mejor alternativa. Ciertamente hace el trabajo probado y funciona :-) gracias. – Thomas

+0

A partir de .NET 4, este método funciona tanto para IP v4 como para IP v6. Sin embargo, solo funciona para IP v4 para todas las versiones anteriores de .NET, .NET 2.0/3.0/3.5 si está familiarizado con la forma de interpretar la documentación de MSDN. –

+0

Creo que debería ser una comparación '> 0' en caso de múltiples lectores. –