Wenn Sie sich nicht darauf verlassen können, dass Sie Ihre IP-Adresse von einem DNS-Server erhalten (was mir passiert ist), können Sie die folgende Methode verwenden:
Der Namespace System.Net.NetworkInformation enthält eine NetworkInterface-Klasse die eine statische GetAllNetworkInterfaces-Methode .
Diese Methode gibt alle "Netzwerkschnittstellen" auf Ihrem Rechner zurück, und davon gibt es in der Regel eine ganze Menge, selbst wenn Sie nur einen drahtlosen Adapter und/oder einen Ethernet-Adapter auf Ihrem Rechner installiert haben. Alle diese Netzwerkschnittstellen haben gültige IP-Adressen für Ihren lokalen Rechner, obwohl Sie wahrscheinlich nur eine haben wollen.
Wenn Sie nach einer IP-Adresse suchen, müssen Sie die Liste so lange filtern, bis Sie die richtige Adresse gefunden haben. Wahrscheinlich müssen Sie ein wenig experimentieren, aber ich hatte Erfolg mit dem folgenden Ansatz:
- Filtern Sie alle Netzwerkschnittstellen heraus, die inaktiv sind, indem Sie auf
OperationalStatus == OperationalStatus.Up
. Dadurch wird z. B. Ihr physischer Ethernet-Adapter ausgeschlossen, wenn Sie kein Netzwerkkabel eingesteckt haben.
Für jedes NetworkInterface können Sie eine IPInterfaceProperties Objekt unter Verwendung der GetIPProperties-Methode und von einem IPInterfaceProperties-Objekt können Sie auf die UnicastAddresses-Eigenschaft für eine Liste von UnicastIPAddressInformation Objekte.
- Ausfiltern von nicht bevorzugten Unicast-Adressen durch Überprüfung auf
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
- Herausfiltern von "virtuellen" Adressen durch Überprüfung auf
AddressPreferredLifetime != UInt32.MaxValue
.
An diesem Punkt nehme ich die Adresse der ersten (wenn überhaupt) Unicast-Adresse, die allen diesen Filtern entspricht.
EDIT:
(überarbeiteter Code vom 16. Mai 2018, um die im obigen Text genannten Bedingungen für den Zustand der doppelten Adresserkennung und die bevorzugte Lebensdauer aufzunehmen)
Das folgende Beispiel zeigt die Filterung auf der Grundlage des Betriebsstatus, der Adressfamilie, mit Ausnahme der Loopback-Adresse (127.0.0.1), des Status der Erkennung doppelter Adressen und der bevorzugten Lebensdauer.
static IEnumerable<IPAddress> GetLocalIpAddresses()
{
// Get the list of network interfaces for the local computer.
var adapters = NetworkInterface.GetAllNetworkInterfaces();
// Return the list of local IPv4 addresses excluding the local
// host, disconnected, and virtual addresses.
return (from adapter in adapters
let properties = adapter.GetIPProperties()
from address in properties.UnicastAddresses
where adapter.OperationalStatus == OperationalStatus.Up &&
address.Address.AddressFamily == AddressFamily.InterNetwork &&
!address.Equals(IPAddress.Loopback) &&
address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
address.AddressPreferredLifetime != UInt32.MaxValue
select address.Address);
}