Question

Je dois obtenir l'adresse IP réelle du réseau local de l'ordinateur (par exemple 192.168.0.220) auprès de mon programme à l'aide de C # et de .NET 3.5. Je ne peux pas simplement utiliser 127.0.0.1 dans ce cas.

Quelle est la meilleure façon de faire cela?

Était-ce utile?

La solution

Lien On y dit, ajoutez System.net, et utilisez ce qui suit

    //To get the local IP address 
string sHostName = Dns.GetHostName (); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); 
}

Autres conseils

Si vous recherchez le type d'informations que l'utilitaire de ligne de commande, ipconfig, peut fournir, vous devriez probablement utiliser l'espace de noms System.Net.NetworkInformation.

Cet exemple de code énumère toutes les interfaces réseau et exporte les adresses connues pour chaque adaptateur.

using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main(string[] args)
    {
        foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() )
        {
            Console.WriteLine("Network Interface: {0}", netif.Name);
            IPInterfaceProperties properties = netif.GetIPProperties();
            foreach ( IPAddress dns in properties.DnsAddresses )
                Console.WriteLine("\tDNS: {0}", dns);
            foreach ( IPAddressInformation anycast in properties.AnycastAddresses )
                Console.WriteLine("\tAnyCast: {0}", anycast.Address);
            foreach ( IPAddressInformation multicast in properties.MulticastAddresses )
                Console.WriteLine("\tMultiCast: {0}", multicast.Address);
            foreach ( IPAddressInformation unicast in properties.UnicastAddresses )
                Console.WriteLine("\tUniCast: {0}", unicast.Address);
        }
    }
}

Vous êtes probablement le plus intéressé par les adresses UnicastAddresses.

Pour utiliser Dns, votre ordinateur doit être enregistré auprès du serveur DNS local, ce qui n'est pas nécessairement le cas si vous êtes sur un intranet et encore moins si vous êtes chez vous avec un fournisseur de services Internet. Il faut également un aller-retour sur le réseau pour découvrir des informations sur votre propre ordinateur.

La bonne manière:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface  adapter in  nics)
{
    foreach(var x in adapter.GetIPProperties().UnicastAddresses)
    {
        if (x.Address.AddressFamily == AddressFamily.InterNetwork  && x.IsDnsEligible)
        {
                    Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString());
        }
    }
}

(MISE À JOUR 31 juil. 2015: Résolution de quelques problèmes avec le code)

Ou pour ceux qui aiment juste une ligne de Linq:

NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork  && adr.IsDnsEligible)
    .Select (adr => adr.Address.ToString());

Comme une machine peut avoir plusieurs adresses IP, le moyen correct de déterminer l'adresse IP que vous allez utiliser pour accéder à Internet en général est d'ouvrir une socket vers un hôte sur Internet, puis d'inspecter le connexion socket pour voir quelle est l'adresse locale utilisée dans cette connexion.

En inspectant la connexion de socket, vous pourrez prendre en compte des tables de routage étranges, des adresses IP multiples et des noms d’hôte whacky. Le truc avec le nom d’hôte ci-dessus peut fonctionner, mais je ne le considérerais pas comme totalement fiable.

Si vous savez qu'il existe une ou plusieurs adresses IPv4 pour votre ordinateur, l'une d'entre elles est fournie:

Dns.GetHostAddresses(Dns.GetHostName())
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()

GetHostAddresses bloque normalement le thread appelant pendant qu'il interroge le serveur DNS et lève une SocketException en cas d'échec de la requête. Je ne sais pas s'il saute l'appel du réseau lors de la recherche de votre propre nom d'hôte.

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