Pergunta

Eu tenho algum código aqui que funciona muito bem em máquinas IPv4, mas em nosso servidor de compilação (uma IPv6) ele falhar. Em poucas palavras:

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

A documentação para GetHostEntry diz que passando em string.Empty você irá obter o endereço IPv4 do localhost. É isso que eu quero. O problema é que ele está retornando a string ":: 1:". Na nossa máquina IPv6, que eu acredito é o endereço IPv6

O ping a máquina de qualquer outra máquina IPv4 dá um bom endereço IPv4 ... e fazendo um "ping -4 machinename" de si mesmo dá o endereço IPv4 correta .... mas ping-lo regularmente de si mesmo dá ":: 1:".

Como posso obter o IPv4 para esta máquina, de si mesmo?

Foi útil?

Solução

Você já olhou para tudo os endereços no retorno, descarte as de família InterNetworkV6 e reter apenas os IPv4?

Outras dicas

Para encontrar todos os endereços IPv4 locais:

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

ou uso Array.Find ou Array.FindLast se você quer apenas um.

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

Declare MyIP e meuHost na variável pública e uso em qualquer função da 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 localizar todos lista de endereços válidos este é o código que tenho usado

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top