Domanda

Ho un po 'qui il codice che funziona molto sulle macchine IPv4, ma sul nostro server build (IPv6) viene a mancare. In poche parole:

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

La documentazione per GetHostEntry dice che passando string.Empty otterrà l'indirizzo IPv4 del localhost. Questo è quello che voglio. Il problema è che è il ritorno la stringa ":: 1:". Sulla nostra macchina IPv6, che credo sia l'indirizzo IPv6

Il ping della macchina da qualsiasi altra macchina IPv4 dà un buon indirizzo IPv4 ... e facendo un "ping -4 machinename" da se stessa dà l'indirizzo IPv4 corretto .... ma il ping regolarmente da se stessa dà ":: 1:".

Come posso ottenere l'IPv4 per questa macchina, da se stesso?

È stato utile?

Soluzione

Hai guardato tutto gli indirizzi nel ritorno, scartare quelle di famiglia InterNetworkV6 e mantenere solo quelli IPv4?

Altri suggerimenti

Per trovare tutti gli indirizzi IPv4 locali:

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

o utilizzare Array.Find o Array.FindLast se si desidera solo 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();
            }
        }
    }

Dichiarare MyIP e myhost in variabile pubblica e utilizzare in qualsiasi funzione della 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;
    }

Per trovare tutta la lista di indirizzo valido questo è il codice che ho usato

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top