Come posso ottenere l'indirizzo IP della rete locale di un computer a livello di codice?

StackOverflow https://stackoverflow.com/questions/151231

  •  02-07-2019
  •  | 
  •  

Domanda

Devo ottenere l'indirizzo IP di rete locale reale del computer (ad esempio 192.168.0.220) dal mio programma usando C # e .NET 3.5. In questo caso non posso semplicemente usare 127.0.0.1.

Qual è il modo migliore per farlo?

È stato utile?

Soluzione

Link Dice lì, aggiungi System.net e usando il seguente

    //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 ()); 
}

Altri suggerimenti

Se stai cercando il tipo di informazioni che l'utilità della riga di comando, ipconfig, può fornire, dovresti probabilmente usare lo spazio dei nomi System.Net.NetworkInformation.

Questo codice di esempio enumera tutte le interfacce di rete e scarica gli indirizzi noti per ciascun adattatore.

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

Probabilmente sei più interessato a UnicastAddresses.

L'uso di Dns richiede che il tuo computer sia registrato con il server DNS locale, il che non è necessariamente vero se sei su una rete intranet, e ancor meno probabile se sei a casa con un ISP. Richiede anche un roundtrip di rete, tutto per scoprire informazioni sul tuo computer.

Il modo corretto:

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

(AGGIORNAMENTO 31-lug-2015: risolti alcuni problemi con il codice)

O per coloro a cui piace solo una linea di Linq:

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

Dato che una macchina può avere più indirizzi IP, il modo corretto per capire il tuo indirizzo IP che utilizzerai per instradare a Internet in generale è quello di aprire un socket a un host su Internet, quindi ispezionare il connessione socket per vedere qual è l'indirizzo locale utilizzato in quella connessione.

Ispezionando la connessione socket, sarai in grado di prendere in considerazione strane tabelle di routing, più indirizzi IP e nomi host bizzarri. Il trucco con il nome host sopra può funzionare, ma non lo considero del tutto affidabile.

Se sai che ci sono uno o più indirizzi IPv4 per il tuo computer, questo fornirà uno di essi:

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

GetHostAddresses normalmente blocca il thread chiamante mentre interroga il server DNS e genera un SocketException se la query fallisce. Non so se salta la chiamata di rete quando cerchi il tuo nome host.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top