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?

¿Fue útil?

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 ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top