54 votes

Obtenir les adresses IPv4 de DNS.GetHostEntry()

J'ai ici un code qui fonctionne très bien sur les machines IPv4, mais sur notre serveur de construction (un IPv6), il échoue. En quelques mots :

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

La documentation de GetHostEntry indique qu'en passant par string.Empty, on obtient l'adresse IPv4 de l'hôte local. C'est ce que je veux. Le problème est qu'il renvoie la chaîne "::1 :" sur notre machine IPv6, qui, je pense, est l'adresse IPv6.

Pinging de la machine depuis n'importe quelle autre machine IPv4 donne une bonne adresse IPv4... et faire un "ping -4 machinename" à partir d'elle-même donne l'adresse IPv4 correcte.... mais l'envoyer régulièrement à partir d'elle-même donne "::1 :".

Comment puis-je obtenir l'IPv4 de cette machine, à partir d'elle-même ?

67voto

Remus Rusanu Points 159382

Avez-vous regardé toutes les adresses dans le retour, éliminez ceux de famille InterNetworkV6 et ne conserver que les IPv4 ?

52voto

Gary Points 826

Pour trouver toutes les adresses IPv4 locales :

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

ou utiliser Array.Find o Array.FindLast si vous n'en voulez qu'un.

12voto

Milan Švec Points 1447
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);

5voto

Naveen Desosha Points 41
    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 monIP et monHost dans Variable publique et utilisez-les dans toute fonction de ce type.

2voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X