Lokale IPs rausfinden
Für einen Netzwerkserver, der in regelmäßigen Abständen ein Broadcast verschickt, brauchte ich seine aktuelle IP-Adresse. Es gibt im Internet mehrere Tutorials, die sich damit beschäftigen, aber der typische Weg ist beim DNS nach seinem eigenen Hostnamen zu fragen.
Ideal ist das nicht, da man typischerweise genau eine Adresse bekommt. Allerdings bietet .Net da auch deutlich mehr.
Da man unter Umständen nicht nur eine IPv4-Adresse sondern auch andere Adressen bekommen möchte, und auch alle IP-Adressen aller Interfaces bekommen möchte, kann man die Klasse System.Net.NetworkInformation.NetworkInterface fragen. Diese beitet die Methode GetAllNetworkInterfaces() an, die einem alle Netzwerkinterfaces zurückgibt. Diese kann man dann nach ihren jeweiligen Adressen fragen.
GetAllNetworkInterfaces() gibt einem eine Liste aller Netzwerkinterfaces zurück. Diese haben jeweils eine Methode GetIPProperties() und das dabei zurückgegebene Objekt die Property UnicastAddresses. Über die zurückgegebene Collection kann man dann iterieren oder mit LINQ eine Abfrage erstellen.
var ifs = NetworkInterface.GetAllNetworkInterfaces();
List<IPAddress> adresses = new List<IPAddress>();
foreach (var i in ifs)
{
System.Diagnostics.Debug.WriteLine
(i.Name + "\n=============================");
var z = i.GetIPProperties().UnicastAddresses.ToList();
var y = from item
in z
where item.Address.AddressFamily
== AddressFamily.InterNetwork
select item.Address;
adresses.AddRange(y);
foreach (var item in y)
{
System.Diagnostics.Debug.WriteLine
(item.ToString());
}
System.Diagnostics.Debug.WriteLine("\n");
}
Dieses kleine Code-Snippet gibt einem alle lokalen IPv4-Adressen in der Debug-Konsole aus. Um z.B. alle IPv6-Adressen auszugeben ändert man die where-Klausel in
where item.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6
Wenn man den Filter wegläßt, bekommt man alle unterstützten Adressen, das will man aber normalerweise nicht.
