web-dev-qa-db-fra.com

Obtenir les adresses IPv4 de Dns.GetHostEntry ()

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

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

La documentation de GetHostEntry indique que le fait de passer string.Empty vous donnera 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 est, je crois, l’adresse IPv6.

Faire un ping sur la machine depuis une autre machine IPv4 donne une bonne adresse IPv4 ... et faire un "ping -4 machinename" à partir de lui-même donne la bonne adresse IPv4 .... 1:".

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

45
zombat

Avez-vous consulté toutes les adresses dans le retour, ignorez celles de la famille InterNetworkV6 et conservez uniquement les adresses IPv4?

62
Remus Rusanu

Pour trouver toutes les adresses IPv4 locales:

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

ou utilisez Array.Find ou Array.FindLast si vous en voulez juste un.

41
Gary
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
8
Milan Švec
    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éclarez myIP et myHost en variable publique Et utilisez-les dans n'importe quelle fonction du formulaire.

6
Naveen Desosha
    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;
    }
2
Ronald van Zoelen

Pour trouver toute la liste d'adresses valide, c'est le code que j'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();
}
0
Ravi Shankar