Ottieni l’indirizzo IP locale

In internet ci sono diversi posti che mostrano come ottenere un indirizzo IP. E molti di loro assomigliano a questo esempio:

String strHostName = string.Empty; // Getting Ip address of local machine... // First get the host name of local machine. strHostName = Dns.GetHostName(); Console.WriteLine("Local Machine's Host Name: " + strHostName); // Then using host name, get the IP address list.. IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); IPAddress[] addr = ipEntry.AddressList; for (int i = 0; i < addr.Length; i++) { Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); } Console.ReadLine(); 

Con questo esempio ottengo diversi indirizzi IP, ma mi interessa solo ottenere quello che il router assegna al computer che esegue il programma: l’IP che vorrei dare a qualcuno se desidera accedere a una cartella condivisa nel mio computer per esempio.

Se non sono connesso a una rete e sono connesso a Internet direttamente tramite un modem senza router, mi piacerebbe ricevere un errore. Come posso vedere se il mio computer è connesso a una rete con C # e se è quindi necessario ottenere l’indirizzo IP della LAN.

Per ottenere l’indirizzo IP locale:

 public static string GetLocalIPAddress() { var host = Dns.GetHostEntry(Dns.GetHostName()); foreach (var ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { return ip.ToString(); } } throw new Exception("No network adapters with an IPv4 address in the system!"); } 

Per verificare se sei connesso o meno:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

Esiste un modo più preciso quando sono disponibili indirizzi IP multipli sulla macchina locale. Connect un socket UDP e leggi il suo endpoint locale:

 string localIP; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) { socket.Connect("8.8.8.8", 65530); IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; localIP = endPoint.Address.ToString(); } 

Connect su un socket UDP ha il seguente effetto: imposta la destinazione per Send / Recv , scarta tutti i pacchetti da altri indirizzi e – che è ciò che usiamo – trasferisce il socket nello stato “connesso”, imposta i suoi campi appropriati. Ciò include il controllo dell’esistenza del percorso verso la destinazione in base alla tabella di routing del sistema e l’impostazione dell’endpoint locale di conseguenza. L’ultima parte sembra non documentata ufficialmente, ma sembra un tratto integrale dell’API Berkeley socket (un effetto collaterale dello stato “connesso” UDP) che funziona in modo affidabile sia in Windows che in Linux attraverso le versioni e le distribuzioni.

Quindi, questo metodo fornirà l’indirizzo locale che verrebbe utilizzato per connettersi all’host remoto specificato. Non esiste una connessione reale stabilita, quindi l’IP remoto specificato può essere irraggiungibile.

Refactoring del codice di Mrcheif per sfruttare Linq (cioè .Net 3.0+). .

 private IPAddress LocalIPAddress() { if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { return null; } IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); return host .AddressList .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); } 

🙂

So che potrebbe essere prendere a calci un cavallo morto, ma forse questo può aiutare qualcuno. Ho cercato dappertutto un modo per trovare il mio indirizzo IP locale, ma ovunque lo trovo dice di usare:

 Dns.GetHostEntry(Dns.GetHostName()); 

Non mi piace affatto perché riceve tutti gli indirizzi assegnati al tuo computer. Se si dispone di più interfacce di rete (che praticamente tutti i computer fanno ora-a-giorni) non si ha idea di quale indirizzo corrisponda all’interfaccia di rete. Dopo aver fatto un sacco di ricerche ho creato una funzione per usare la class NetworkInterface e strappare le informazioni da essa. In questo modo posso dire che tipo di interfaccia è (Ethernet, wireless, loopback, tunnel, ecc.), Se è triggers o meno, e SOOO molto di più.

 public string GetLocalIPv4(NetworkInterfaceType _type) { string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { output = ip.Address.ToString(); } } } } return output; } 

Ora per ottenere l’indirizzo IPv4 della tua chiamata dell’interfaccia di rete Ethernet:

 GetLocalIPv4(NetworkInterfaceType.Ethernet); 

Oppure la tua interfaccia wireless:

 GetLocalIPv4(NetworkInterfaceType.Wireless80211); 

Se si tenta di ottenere un indirizzo IPv4 per un’interfaccia wireless, ma il computer non dispone di una scheda wireless installata, verrà restituita una stringa vuota. Stessa cosa con l’interfaccia Ethernet.

Spero che questo aiuti qualcuno! 🙂

MODIFICARE:

È stato sottolineato (grazie a @NasBanov) che anche se questa funzione riguarda l’estrazione dell’indirizzo IP in un modo molto migliore rispetto all’utilizzo di Dns.GetHostEntry(Dns.GetHostName()) , non supporta molto il supporto di più interfacce del stesso tipo o più indirizzi IP su una singola interfaccia. Restituirà un solo indirizzo IP solo quando potrebbero essere assegnati più indirizzi. Per restituire TUTTI questi indirizzi assegnati, puoi semplicemente manipolare la funzione originale per restituire sempre una matrice invece di una singola stringa. Per esempio:

 public static string[] GetAllLocalIPv4(NetworkInterfaceType _type) { List ipAddrList = new List(); foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { ipAddrList.Add(ip.Address.ToString()); } } } } return ipAddrList.ToArray(); } 

Ora questa funzione restituirà TUTTI gli indirizzi assegnati per uno specifico tipo di interfaccia. Ora per ottenere una sola stringa, è ansible utilizzare l’estensione .FirstOrDefault() per restituire il primo elemento nell’array o, se è vuoto, restituire una stringa vuota.

 GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault(); 

Ecco una versione modificata (da quella di compman2408) che ha funzionato per me:

 internal static string GetLocalIPv4(NetworkInterfaceType _type) { string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties adapterProperties = item.GetIPProperties(); if (adapterProperties.GatewayAddresses.FirstOrDefault() != null) { foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses) { if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { output = ip.Address.ToString(); } } } } } return output; } 

La modifica: sto recuperando l’IP da un adattatore a cui è assegnato un IP gateway.

Questo è il codice migliore che ho trovato per ottenere l’IP corrente, evitando di ottenere l’host VMWare o un altro indirizzo IP non valido.

 public string GetLocalIpAddress() { UnicastIPAddressInformation mostSuitableIp = null; var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (var network in networkInterfaces) { if (network.OperationalStatus != OperationalStatus.Up) continue; var properties = network.GetIPProperties(); if (properties.GatewayAddresses.Count == 0) continue; foreach (var address in properties.UnicastAddresses) { if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue; if (IPAddress.IsLoopback(address.Address)) continue; if (!address.IsDnsEligible) { if (mostSuitableIp == null) mostSuitableIp = address; continue; } // The best IP is the IP got from DHCP server if (address.PrefixOrigin != PrefixOrigin.Dhcp) { if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible) mostSuitableIp = address; continue; } return address.Address.ToString(); } } return mostSuitableIp != null ? mostSuitableIp.Address.ToString() : ""; } 

Penso che l’uso di LinQ sia più semplice:

 Dns.GetHostEntry(Dns.GetHostName()) .AddressList.First( f => f.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) .ToString() 

@ mrcheif Ho trovato questa risposta oggi ed è stato molto utile anche se ha restituito un IP errato (non dovuto al fatto che il codice non funziona) ma ha dato l’IP di internetwork sbagliato quando hai cose come Himachi in esecuzione.

 public static string localIPAddress() { IPHostEntry host; string localIP = ""; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { localIP = ip.ToString(); string[] temp = localIP.Split('.'); if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192") { break; } else { localIP = null; } } return localIP; } 

Per una risata, ho pensato di provare ad ottenere una singola istruzione LINQ utilizzando il nuovo operatore C-6 null-condizionale. Sembra piuttosto pazzo e probabilmente orribilmente inefficiente, ma funziona.

 private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet) { // Bastardized from: http://stackoverflow.com/a/28621250/2685650. return NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(ni => ni.NetworkInterfaceType == type && ni.OperationalStatus == OperationalStatus.Up && ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null && ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null ) ?.GetIPProperties() .UnicastAddresses .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) ?.Address ?.ToString() ?? string.Empty; } 

Logica per gentile concessione di Gerardo H (e per riferimento compman2408 ).

Prerequisiti: è necessario aggiungere il riferimento System.Data.Linq e riferirlo

 using System.Linq; string ipAddress =""; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork)); 

Altro modo di ottenere IP usando l’espressione linq:

  public static List GetAllLocalIPv4(NetworkInterfaceType type) { return NetworkInterface.GetAllNetworkInterfaces() .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up) .SelectMany(x => x.GetIPProperties().UnicastAddresses) .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork).Select(x => x.Address.ToString()).ToList(); } 
 string str=""; System.Net.Dns.GetHostName(); IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(str); IPAddress[] addr = ipEntry.AddressList; string IP="Your Ip Address Is :->"+ addr[addr.Length - 1].ToString(); 

Tieni presente che, nel caso generale, potresti avere più traduzioni NAT attive e più server DNS, ognuno dei quali opera su diversi livelli di traduzione NAT.

Cosa succede se si dispone di NAT di livello carrier e si desidera comunicare con altri clienti della stessa compagnia aerea? Nel caso generale, non si sa mai con certezza perché potrebbe apparire con nomi host diversi in ogni traduzione NAT.

Solo una mia versione aggiornata usando LINQ:

  ///  /// Gets the local Ipv4. ///  /// The local Ipv4. /// Network interface type. IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType) { var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces() .Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up); foreach (NetworkInterface networkInterface in networkInterfaces) { var adapterProperties = networkInterface.GetIPProperties(); if (adapterProperties.GatewayAddresses.FirstOrDefault() != null) { foreach (UnicastIPAddressInformation ip in networkInterface.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { return ip.Address; } } } } return null; } 

Obsoleto andato, questo funziona per me

 public static IPAddress GetIPAddress() { IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First(); return ip; } 

Aggiungendo la risposta di Mrchief a Linq, avremo:

 public static IPAddress GetLocalIPAddress() { var host = Dns.GetHostEntry(Dns.GetHostName()); var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); return ipAddress; } 

Stavo anche lottando per ottenere l’IP corretto.

Ho provato una varietà di soluzioni qui ma nessuno mi ha fornito l’effetto desiderato. Quasi tutti i test condizionali forniti non hanno utilizzato alcun indirizzo.

Questo è ciò che ha funzionato per me, spero che aiuti …

 var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address) where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork select address).FirstOrDefault(); Console.WriteLine(firstAddress); 
 Dns.GetHostEntry(Dns.GetHostName()).AddressList[1] 

una riga di codice: D

Se si dispone di macchine virtuali o tabs di rete aggiuntive, potrebbero essere presenti altri valori nell’elenco di indirizzi. Il mio suggerimento è di controllare le voci di lista di indirizzi e stampare che è appropriato. Nel mio caso la voce 3 era l’indirizzo IPv4 della mia macchina

 IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddr = ipHost.AddressList[3]; string ip = ipAddr.ToString(); 

Non dimenticare di aggiungere using System.Net;

Ecco un 1-liner completamente funzionale e solido per la domanda di indirizzo IP locale. Realizzato con il linguaggio di esecuzione parallelo Dyalog APL. È interessante notare che questa piccola parte di codice supporta 0, 1 o più adattatori IPv4 – il risultato sarà semplicemente un array con lunghezza 0, 1 o n di vettori di testo racchiusi.

Soprattutto per la tua confusione, immagino 🙂

 #.Dns.(a.AddressFamily.(⎕THIS=InterNetwork)/a←(GetHostEntry GetHostName).AddressList).ToString 

Restituisce (per questo computer): 192.168.0.100 (<- un vettore in box di un elemento, il primo elemento è un vettore di testo di 13 caratteri)