Holen Sie sich die lokale IP-Adresse

Im Internet gibt es mehrere Orte, die Ihnen zeigen, wie Sie eine IP-Adresse erhalten. Und viele von ihnen sehen wie dieses Beispiel aus:

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

Mit diesem Beispiel erhalte ich mehrere IP-Adressen, aber ich bin nur daran interessiert, denjenigen zu bekommen, den der Router dem Computer zuweist, auf dem das Programm läuft: die IP, die ich jemandem geben würde, wenn er auf einen freigegebenen Ordner in meinem Computer zugreifen möchte Beispiel.

Wenn ich nicht mit einem Netzwerk verbunden bin und ich direkt über ein Modem ohne Router mit dem Internet verbunden bin, möchte ich einen Fehler bekommen. Wie kann ich sehen, ob mein Computer mit einem Netzwerk mit C # verbunden ist und ob es dann die LAN-IP-Adresse bekommen soll.

Solutions Collecting From Web of "Holen Sie sich die lokale IP-Adresse"

Um lokale IP-Adresse zu erhalten:

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

Um zu überprüfen, ob Sie verbunden sind oder nicht:

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

Es gibt eine genauere Möglichkeit, wenn auf dem lokalen Computer mehrere IP-Adressen verfügbar sind. Connect einen UDP-Socket und lies seinen lokalen Endpunkt:

 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 auf einem UDP-Socket hat folgenden Effekt: Er setzt das Ziel für Send / Recv , verwirft alle Pakete von anderen Adressen, und – was wir verwenden – überträgt den Socket in den Zustand “connected”, setzt die entsprechenden Felder. Dazu gehört das Überprüfen der Existenz der Route zum Ziel entsprechend der Routing-Tabelle des Systems und das entsprechende Einstellen des lokalen Endpunkts. Der letzte Teil scheint offiziell nicht dokumentiert zu sein, aber es scheint ein integraler Bestandteil der Berkeley Sockets API zu sein (ein Nebeneffekt des “verbundenen” UDP-Zustands), der sowohl in Windows als auch in Linux über Versionen und Distributionen zuverlässig funktioniert.

Diese Methode gibt die lokale Adresse an, die für die Verbindung mit dem angegebenen Remote-Host verwendet wird. Es gibt keine echte Verbindung, daher kann die angegebene Remote-IP nicht erreichbar sein.

Den Code von Mrcheif umgestalten, um Linq (dh .Net 3.0+) zu nutzen. .

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

🙂

Ich weiß, dass dies ein totes Pferd treten kann, aber vielleicht kann das jemandem helfen. Ich habe überall nach einem Weg gesucht, um meine lokale IP-Adresse zu finden, aber überall finde ich es zu verwenden:

 Dns.GetHostEntry(Dns.GetHostName()); 

Ich mag das überhaupt nicht, weil es nur alle Adressen bekommt, die Ihrem Computer zugewiesen sind. Wenn Sie mehrere Netzwerkschnittstellen haben (was so ziemlich alle Computer heute tun), haben Sie keine Ahnung, welche Adresse zu welcher Netzwerkschnittstelle gehört. Nach ein paar Recherchen habe ich eine function erstellt, um die NetworkInterface-class zu verwenden und die Informationen daraus zu entfernen. Auf diese Weise kann ich feststellen, welche Art von Schnittstelle es ist (Ethernet, Wireless, Loopback, Tunnel usw.), ob es aktiv ist oder nicht und SOOO viel mehr.

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

Um die IPv4-Adresse Ihrer Ethernet-Netzwerkschnittstelle abzurufen, rufen Sie Folgendes auf:

 GetLocalIPv4(NetworkInterfaceType.Ethernet); 

Oder Ihre drahtlose Schnittstelle:

 GetLocalIPv4(NetworkInterfaceType.Wireless80211); 

Wenn Sie versuchen, eine IPv4-Adresse für eine drahtlose Schnittstelle zu erhalten, aber auf Ihrem Computer ist keine drahtlose Karte installiert, wird nur eine leere Zeichenfolge zurückgegeben. Das gleiche gilt für die Ethernet-Schnittstelle.

Hoffe das hilft jemandem! 🙂

BEARBEITEN:

Es wurde darauf hingewiesen (danke @NasBanov), dass obwohl diese function geht über das Extrahieren der IP-Adresse auf eine viel bessere Weise als mit Dns.GetHostEntry(Dns.GetHostName()) es nicht sehr gut bei der Unterstützung mehrerer Schnittstellen der gleicher Typ oder mehrere IP-Adressen auf einer einzelnen Schnittstelle. Es gibt nur eine einzelne IP-Adresse zurück, wenn mehrere Adressen zugewiesen sind. Um ALLE diese zugewiesenen Adressen zurückzugeben, können Sie einfach die ursprüngliche function bearbeiten, um immer ein Array anstelle einer einzelnen Zeichenfolge zurückzugeben. Beispielsweise:

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

Jetzt gibt diese function ALLE zugewiesenen Adressen für einen bestimmten Schnittstellentyp zurück. Um jetzt nur eine einzige Zeichenfolge zu erhalten, können Sie die Erweiterung .FirstOrDefault() , um das erste Element im Array zurückzugeben oder, falls es leer ist, eine leere Zeichenfolge zurückzugeben.

 GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault(); 

Hier ist eine modifizierte Version (von compman2408), die für mich funktionierte:

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

Die Änderung: Ich rufe die IP von einem Adapter ab, dem eine Gateway-IP zugewiesen ist.

Dies ist der beste Code, den ich gefunden habe, um die aktuelle IP zu erhalten und VMWare-Host oder andere ungültige IP-Adressen zu vermeiden.

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

Ich denke, mit LinQ ist einfacher:

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

@mrcheif Ich fand diese Antwort heute und es war sehr nützlich, obwohl es eine falsche IP zurückgegeben hat (nicht wegen des Codes nicht funktioniert), aber es gab die falsche Internetwork IP, wenn Sie Dinge wie Himachi laufen haben.

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

Zum Lachen dachte ich, ich würde versuchen, eine einzelne LINQ-statement zu bekommen, indem ich den neuen C-6-bedingten Operator verwende. Sieht ziemlich verrückt und wahrscheinlich schrecklich ineffizient aus, aber es funktioniert.

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

Logik mit freundlicher Genehmigung von Gerardo H (und Referenz compman2408 ).

Voraussetzungen: Sie müssen die System.Data.Linq-Referenz hinzufügen und auf sie verweisen

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

Andere Möglichkeit, IP mit linq expression zu erhalten:

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

Beachten Sie, dass Sie im Allgemeinen mehrere NAT-Übersetzungen und mehrere DNS-Server verwenden können, die jeweils auf verschiedenen NAT-Übersetzungsebenen arbeiten.

Was ist, wenn Sie NAT in Carrier-Qualität haben und mit anderen Kunden desselben Carriers kommunizieren möchten? Im allgemeinen Fall wissen Sie nie sicher, weil Sie bei jeder NAT-Übersetzung mit unterschiedlichen Hostnamen angezeigt werden.

Nur eine aktualisierte Version von mir mit 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; } 

Obsolete gegangen, das funktioniert für mich

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

Wenn wir die Antwort von Mrchief mit Linq aktualisieren, werden wir:

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

Ich hatte auch Probleme damit, die richtige IP zu erhalten.

Ich habe hier verschiedene Lösungen ausprobiert, aber keiner hat mir den gewünschten Effekt gegeben. Fast alle der bedingten Tests, die bereitgestellt wurden, führten dazu, dass keine Adresse verwendet wurde.

Das hat bei mir funktioniert, hoffe es hilft …

 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] 

eine Codezeile: D

Wenn Sie virtuelle Maschinen oder zusätzliche Netzwerkkarten haben, können andere Werte in der Adressliste vorhanden sein. Mein Vorschlag ist, die Einträge der Adressliste zu prüfen und zu drucken, was angemessen ist. In meinem Fall war Eintrag 3 die IPv4-Adresse meines Rechners

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

Vergessen Sie nicht, using System.Net; hinzuzufügen using System.Net;

Hier kommt ein voll funktionsfähiger und solider 1-Liner für die lokale IP-Adresse-Frage. Hergestellt mit der parallelen Ausführungssprache Dyalog APL. Interessanterweise unterstützt dieser kleine Teil des Codes 0, 1 oder mehrere IPv4-Adapter – das Ergebnis wird nur ein Array mit der Länge 0, 1 oder n von eingeschlossenen Textvektoren sein.

Meistens für deine Verwirrung, ich denke 🙂

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

Rückgabewerte (für diesen Computer): 192.168.0.100 (< - Ein-Element-Box-Vektor, wobei das erste Element ein 13-stelliger Textvektor ist)