Obtener direcciones IPv4 de Dns.GetHostEntry ()
Pregunta
Tengo algo de código aquí que funciona muy bien en las máquinas IPv4, pero en nuestro servidor de compilación (IPv6) se produce un error. En pocas palabras:
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 está devolviendo la cadena ":: 1:". IPv6 en nuestra máquina, 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, de sí misma?
Solución
¿Has mirado en todo las direcciones en el retorno, desechar los de familia InterNetworkV6 y retener sólo los IPv4?
Otros consejos
Para encontrar todas las direcciones IPv4 locales:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
o usar Array.Find
o Array.FindLast
si lo que desea uno.
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
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();
}
}
}
Declarar MyIP y myhost en la variable pública y uso en cualquier función de la forma.
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;
}
Para encontrar toda la lista de direcciones válidas este es el código que he 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();
}
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 ()