2009-06-29 22 views
44

Tengo aquí un código que funciona muy bien en máquinas IPv4, pero en nuestro servidor de compilación (un IPv6) falla. En pocas palabras:Obtener direcciones IPv4 de Dns.GetHostEntry()

IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty); 

La documentación para GetHostEntry dice que pasa en String.Empty le dará la dirección IPv4 del host local. Esto es lo que quiero. El problema es que devuelve la cadena ":: 1:" en nuestra máquina IPv6, que creo que es la dirección IPv6.

ping al equipo desde cualquier otra máquina IPv4 da una buena dirección IPv4 ... y haciendo un "ping -4 machinename" de sí misma da la dirección IPv4 correcta .... pero ping regularmente de sí mismo da " :: 1: ".

¿Cómo puedo obtener el IPv4 para esta máquina, desde sí mismo?

Respuesta

60

¿Has mirado all the addresses en la devolución, descarta los de family InterNetworkV6 y retienes solo los de IPv4?

+1

Ahhhh ... por supuesto . Un momento de bombilla. ¡Gracias! – zombat

+1

+1: Gracias - Estaba a punto de hacer la misma pregunta :) –

+0

Mi llamada solo devuelve entradas de ipv6, no de ipv4. Si hago 'Resolve-DnsName -Type A' en PowerShell, devuelvo el IPv4 (el tipo predeterminado que devuelve en este caso es AAAA). – kamranicus

6
public Form1() 
    { 
     InitializeComponent(); 

     string myHost = System.Net.Dns.GetHostName(); 
     string myIP = null; 

     for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++) 
     { 
      if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false) 
      { 
       myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString(); 
      } 
     } 
    } 

MyIP declarar y myhost en variable pública y uso en cualquier función de la forma.

39

Para encontrar todas las direcciones IPv4 locales:

IPAddress[] ipv4Addresses = Array.FindAll(
    Dns.GetHostEntry(string.Empty).AddressList, 
    a => a.AddressFamily == AddressFamily.InterNetwork); 

o uso Array.Find o Array.FindLast si lo que desea uno.

+6

+1 por usar linq – Nahum

+1

@NahumLitvin Pero esto no es linq? – Lukazoid

+0

@lukazoid ita no. Podría haber significado la expresión lambda – Nahum

0

Para buscar todas las lista de direcciones válidas este es el código que se han utilizado

public static IEnumerable<string> GetAddresses() 
{ 
     var host = Dns.GetHostEntry(Dns.GetHostName()); 
     return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList(); 
} 
2
public static string GetIPAddress(string hostname) 
    { 
     IPHostEntry host; 
     host = Dns.GetHostEntry(hostname); 

     foreach (IPAddress ip in host.AddressList) 
     { 
      if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      { 
       //System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip); 
       return ip.ToString(); 
      } 
     } 
     return string.Empty; 
    } 
-1

IPv6

lblIP.Text = System.Net.Dns.GetHostEntry (System.Net. Dns.GetHostName) .AddressList (0) .ToString()


IPv4

lblIP.Text = System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (1) .ToString()

+0

System.Net.Dns.GetHostName es un método, no una propiedad. – RenniePet

5
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName); 
IPAddress ipAddress = ipHostInfo.AddressList 
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork); 
Cuestiones relacionadas