web-dev-qa-db-fra.com

Comment déterminer les adresses IPv4 de l’hôte local?

Comment obtenir uniquement les adresses Internet Protocol version 4 à partir de Dns.GetHostAddresses()? J'ai le code ci-dessous et il me donne les adresses IPv4 et IPv6 ..__ Je dois le faire fonctionner avec des boîtes qui ont plusieurs adresses IPv4.

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
    {
        foreach (IPAddress a in localIPs)
        {
           server_ip = server_ip + a.ToString() + "/";
        }
    }
27
John Ryann

ajouter quelque chose comme ça à votre code

  if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
  // IPv4 address
26
Joost Evertse

De mon blog :

/// <summary> 
/// This utility function displays all the IP (v4, not v6) addresses of the local computer. 
/// </summary> 
public static void DisplayIPAddresses() 
{ 
    StringBuilder sb = new StringBuilder(); 

    // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) 
    NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); 

    foreach (NetworkInterface network in networkInterfaces) 
    { 
        // Read the IP configuration for each network 
        IPInterfaceProperties properties = network.GetIPProperties(); 

        // Each network interface may have multiple IP addresses 
        foreach (IPAddressInformation address in properties.UnicastAddresses) 
        { 
            // We're only interested in IPv4 addresses for now 
            if (address.Address.AddressFamily != AddressFamily.InterNetwork) 
                continue; 

            // Ignore loopback addresses (e.g., 127.0.0.1) 
            if (IPAddress.IsLoopback(address.Address)) 
                continue; 

            sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")"); 
        } 
    } 

    MessageBox.Show(sb.ToString()); 
}

En particulier, je not ne recommande pas Dns.GetHostAddresses(Dns.GetHostName());, quelle que soit la popularité de cette ligne dans divers articles et blogs.

35
Stephen Cleary

Voici une fonction que j'utilise:

public static string GetIP4Address()
{
    string IP4Address = String.Empty;

    foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
    {
        if (IPA.AddressFamily == AddressFamily.InterNetwork)
        {
            IP4Address = IPA.ToString();
            break;
        }
    }

    return IP4Address;
}

En tant que dénombrable:

public static IEnumerable<string> GetIP4Addresses()
{
    return Dns.GetHostAddresses(Dns.GetHostName())
        .Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
        .Select(x => x.ToString());
}
11
Joe

Très propre et doux lors de l'utilisation de Linq

IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
7
electricalbah

Écrivez locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)

4
SLaks

De MSDN on Dns.GetHostAddresses ,

Lorsqu'une chaîne vide est passée en tant que nom d'hôte, cette méthode retourne les adresses IPv4 de l'hôte local pour tous les systèmes d'exploitation, à l'exception de Windows Server 2003; pour Windows Server 2003, IPv4 et IPv6 les adresses de l'hôte local sont renvoyées.

Les adresses IPv6 sont filtrées des résultats de GetHostAddresses méthode si IPv6 n’est pas installé sur l’ordinateur local. Comme un Par conséquent, il est possible de récupérer une instance IPAddress vide si seulement Les résultats IPv6, s'ils étaient disponibles, pour hostNameOrAddress.parameter.

Vous pouvez donc utiliser ceci pour essayer de l’analyser :

IPAddress.TryParse

puis cochez AddressFamily qui

Renvoie System.Net.Sockets.AddressFamily.InterNetwork pour IPv4 ou System.Net.Sockets.AddressFamily.InterNetworkV6 pour IPv6.

string input = "192.168.0.10";

IPAddress address;
if (IPAddress.TryParse(input, out address))
{
    switch (address.AddressFamily)
    {
        case System.Net.Sockets.AddressFamily.InterNetwork:
            // we have IPv4
            break;
        case System.Net.Sockets.AddressFamily.InterNetworkV6:
            // we have IPv6
            break;
        default:
            // do something else
            break;
    }
}
4
user195488

J'ai utilisé la réponse qui a commencé avec

/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
    if (address.Address.AddressFamily != AddressFamily.InterNetwork) 

Je devais utiliser:

if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)

mais j'ai effectivement utilisé:

if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))

Aussi, j'ai ajouté:

if (network.OperationalStatus != OperationalStatus.Up)
                continue;

Parce que certains réseaux ne fonctionnaient pas et n'auraient jamais dû y être, j'ai constaté qu'ils étaient dans le registre.

1
dulcana

J'utilise cette méthode d'assistance qui renvoie la première adresse IPV4 active après avoir filtré l'IPV6 et le bouclage une fois 


    public static IPAddress GetLocalIPAddress()
    {
        IPAddress result = null;
        IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add));
        if (ipv4Address.Length > 0 )
        {
            result =ipv4Address[0];
        }
        return result;
    }
0
Bedasso

Pour moi, la solution plus propre serait:

 public static string GetLocalIP() 
        {
            string ipv4Address = String.Empty;

            foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName()))
            {
                if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    ipv4Address = currentIPAddress.ToString();
                    break;
                }
            }

            return ipv4Address;
        }
0
svives

Voici un code pour trouver le premier IPv4 connecté en utilisant la boucle for:

        IPAddress ipAddress = null;
        IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());           

        for (int i=0 ; i<localIPs.Length ; i++)
        {
            if (localIPs[i].AddressFamily == AddressFamily.InterNetwork)
            {
                ipAddress = localIPs[i];
                break;
            }                
        }
0
Farid

C'est mon code… .. Et je peux le trouver sur plusieurs cartes LAN.

private string GetLocalIpAddress()
{
    string localIpAddress = string.Empty;
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface nic in nics)
    {
        if (nic.OperationalStatus != OperationalStatus.Up)
        {
            continue;
        }

        IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics();
        UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses;

        if (uniCast != null)
        {
            foreach (UnicastIPAddressInformation uni in uniCast)
            {
                if (adapterStat.UnicastPacketsReceived > 0
                    && adapterStat.UnicastPacketsSent > 0
                    && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                {
                    if (uni.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString();

                        break;
                    }
                }
            }
        }
    }

    return localIpAddress;
}
0
Kim Ki Won