J'ai besoin d'obtenir l'adresse IP du réseau local réel de l'ordinateur (par exemple 192.168.0.220) à partir de mon programme en utilisant C # et .NET 3.5. Je ne peux pas simplement utiliser 127.0.0.1 dans ce cas.
Quelle est la meilleure façon de procéder?
Link Il y est dit, ajoutez System.net, et en utilisant 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 ());
}
Si vous recherchez le type d'informations que l'utilitaire de ligne de commande, ipconfig, peut fournir, vous devez probablement utiliser l'espace de noms System.Net.NetworkInformation.
Cet exemple de code énumérera toutes les interfaces réseau et videra 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 Unicast.
L'utilisation du DNS nécessite que votre ordinateur soit enregistré auprès du serveur DNS local, ce qui n'est pas nécessairement vrai si vous êtes sur un intranet, et encore moins si vous êtes chez vous avec un FAI. Cela nécessite également un aller-retour réseau - le tout pour trouver des informations sur votre propre ordinateur.
La bonne façon:
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-Jul-2015: correction de certains 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, la bonne façon de déterminer votre adresse IP que vous allez utiliser pour acheminer vers Internet général est d'ouvrir un socket vers un hôte sur Internet, puis d'inspecter la connexion du socket à voir quelle est l'adresse locale utilisée dans cette connexion.
En inspectant la connexion du socket, vous pourrez prendre en compte des tables de routage étranges, plusieurs adresses IP et des noms d'hôtes loufoques. L'astuce avec le nom d'hôte ci-dessus peut fonctionner, mais je ne le considérerais pas comme entièrement fiable.
Si vous savez qu'il existe une ou plusieurs adresses IPv4 pour votre ordinateur, cela en fournira une:
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 lance un SocketException
si la requête échoue. Je ne sais pas s'il ignore l'appel réseau lorsque vous recherchez votre propre nom d'hôte.