c# – Windows 7 – Lokale IPV4 Adresse ermitteln

Einige meiner Tools (darunter vor allem eine Monitorprogramm zur Überwachung von Windows Diensten auf Basis eines UDP TraceListener) funktionieren unter Windows 7 nicht mehr korrekt.

Besser gesagt, beim versucht die lokale IP Adresse zu ermitteln tritt folgender Fehler auf:

{System.Net.Sockets.SocketException: Es wurde eine Adresse verwendet, die mit dem angeforderten Protokoll nicht kompatibel ist
   bei System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   bei System.Net.Sockets.Socket.Bind(EndPoint localEP)

 

Der nachfolgende Code Ausschnitt hat unter Windows XP noch einwandfrei funktioniert:

HostIP = Dns.GetHostAddresses(Dns.GetHostName())[0];
endPoint = new IPEndPoint(HostIP, _Port);
UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UDPSocket.Bind(endPoint);

Unter Windows 7 wird aber dabei eine IPV6 Adresse zurückgegeben, mit welcher das Binden des UPD Socket nicht funktioniert.

Nachfolgend nun eine Methode die sowohl unter Windows XP (und den anderen älteren Betriebssystemen) als auch den aktuellen Betriebssystemen wie Windows 7 und W2K8 Server  funktioniert.

foreach (IPAddress address in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
    if (address.AddressFamily != AddressFamily.InterNetworkV6)
    {
        HostIP = address;
        break;
    }
}
endPoint = new IPEndPoint(HostIP, _Port);
UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UDPSocket.Bind(endPoint);

3 Gedanken zu „c# – Windows 7 – Lokale IPV4 Adresse ermitteln“

  1. Hallo Björn,
    geht in diesem Fall genau so. Da Dns.GetHostEntry() nur eine IP Adresse, nämlich eine IPV6 oder IPV4 zurückgibt kommen die anderen Enumerationswerte der AddressFamily nicht in Frage und deshalb müsste das Ergebnis genau das gleiche sein.
    Aber klar, geht auch ein == mit InterNetwork. Oder sehe ich das falsch (das mit GetHostEntry meine ich).

  2. Hallo,

    sehr nettes Snippet, wie kann ich eine IPv4 Adresse in eine Variable speichern und in eine weitere Variable eine IPv6 Adresse, wenn es keines der IPvX vorhanden sind, soll die Variable leer bleiben ??

    Lg

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.