Question

J'ai un code ici qui fonctionne très bien sur les machines IPv4, mais sur notre serveur de build (un IPv6), il tombe en panne. En bref:

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

La documentation GetHostEntry dit que passant string.Empty vous obtiendrez l'adresse IPv4 de l'hôte local. C'est ce que je veux. Le problème est qu'il est de retour de la chaîne « :: 1: ». Sur notre machine IPv6, que je crois est l'adresse IPv6

Pinging la machine de toute autre machine IPv4 donne une bonne adresse IPv4 ... et de faire un "ping -4 machinename" de lui-même donne l'adresse IPv4 correcte .... mais régulièrement pinger de lui-même donne ":: 1:".

Comment puis-je obtenir l'IPv4 pour cette machine, de lui-même?

Était-ce utile?

La solution

Avez-vous regardé tous les adresses dans le retour, jetez-les de InterNetworkV6 famille et ne conserver que celles IPv4?

Autres conseils

Pour toutes les adresses IPv4 locales:

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

ou utiliser ou Array.Find si vous voulez Array.FindLast juste un.

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

Déclarer myIP et Myhost dans variable publique et l'utilisation dans une fonction quelconque du formulaire.

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

Pour toute liste d'adresses valide c'est le code que je l'ai utilisé

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top