Fehler beim Auslesen der IP-Adresse

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    Fehler beim Auslesen der IP-Adresse

    Guten Morgen Zusammen!

    Ich habe mir erlaubt, hier einen neuen Thread zu eröffnen, obwohl ich noch ein ziemlicher Anfänger in VB bin.
    Trotzdem denke ich, dass die Frage nicht zu den Grundlagen gehört, und etwas schwieriger ist :-)


    Ich möchte mit VB (Express) .NET die (alle) IP-Adressen (IPV4/IPV6) auslesen.
    Das sollte ja mit Dns.GetHostEntry problemlos machbar sein. Leider erhalte ich immer eine Fehlermeldung.

    Folgendes ist der Code:

    VB.NET-Quellcode

    1. Dim test As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(My.Computer.Name)


    Die Fehlermeldung lautet:
    Eine nicht behandelte Ausnahme des Typs "System.Net.Sockets.SocketExeption" ist in System.dll aufgetreten.
    Zusätzliche Informationen: Beim Datenbankaufruf ist ein nicht behebbarer Fehler aufgetreten"

    Anstelle von My.Computer.Name habe ich natürlich auch mal den String manuell reingeschrieben. Auch www.google.com funktioniert nicht.
    Mein System ist in DNS Hinsicht aber einwandfrei.
    Ich kann die Host per ping erreichen. NSLOOKUP funktioniert auch einwandfrei.
    Sogar in einer Powershell funktionieren die folgenden beiden Befehle:
    [Net.Dns]::GetHostEntry("google.com")
    [Net.Dns]::GetHostEntry("173.194.40.1")


    Der Code funktioniert auf zwei verschiedenen Windows 8 PCs nicht. (Beide neu aufgesetzt und Visual Basic bereits neu installiert)
    Auf einem 3. Windows 8 PC läuft der Code!

    Kann mir jemand helfen?
    Viele Grüsse
    Veronesi
    Willkommen im Forum! :thumbsup:

    Vielleicht hilft Dir der Ansatz...?

    VB.NET-Quellcode

    1. For Each add As System.Net.IPAddress In System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName())
    2. ListBox1.Items.Add(add.ToString)
    3. Next
    Also bei mir funktioniert der Code auch.. (Windows 8 64 Bit)

    Dieser Fehlercode zeigt an, dass während einer Datenbanksuche irgendein ein nicht behebbarer Fehler aufgetreten ist. Eine mögliche Fehlerursache kann sein, dass die Datenbankdateien (z. B. BSD-kompatible HOSTS-, SERVICES- oder PROTOCOLS-Dateien) nicht gefunden werden konnten oder dass eine DNS-Anforderung vom Server mit einem schweren Fehler zurückgegeben wurde.


    Bist du dir in Sachen DNS-Konfiguration sicher? Alle Netzwerkadapter korrekt eingerichtet?

    MfG Solaris
    Hallo Zusammen.

    Vielen Dank für Eure Antworten und entschuldigt, dass ich so spät antworte!
    Den Tipp von StormySunshine habe ich versucht, aber leider ohne Erfolg. Ich erhalte immer noch die selbe Fehlermeldung.

    Ich bin jedoch ziemlich sicher, dass meine DNS Einstellungen korrekt sind. (Kommen direkt von der Domäne und bei allen Computern funktioniert es, ausser bei diesen zweien)
    Und wie gesagt, sie sind neu aufgesetzt.

    Nun habe ich aber einen neuen Ansatz. Mit dem folgenden Code funktioniert die Rückgabe, allerdings wird dann reklamiert, dass der Befehl obsolete sei....

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function InfoGetComputerName() As String
    2. Return My.Computer.Name() 'System.Net.Dns.GetHostName()
    3. End Function
    4. Public Function InfoGetLocalIPAddresses(fIPV6 As Boolean) As System.Net.IPAddress()
    5. Try
    6. Dim sComputername As String = InfoGetComputerName()
    7. Dim aIPs() As System.Net.IPAddress = System.Net.Dns.GetHostByName(sComputername).AddressList
    8. Dim aIPV4(0) As System.Net.IPAddress
    9. Dim aIPV6(0) As System.Net.IPAddress
    10. For Each IP As System.Net.IPAddress In aIPs
    11. If IP.IsIPv6LinkLocal Then
    12. ReDim Preserve aIPV6(UBound(aIPV6) + 1)
    13. aIPV6(UBound(aIPV6) - 1) = IP
    14. Else
    15. ReDim Preserve aIPV4(UBound(aIPV4) + 1)
    16. aIPV4(UBound(aIPV4) - 1) = IP
    17. End If
    18. Next
    19. ReDim Preserve aIPV6(UBound(aIPV6) - 1)
    20. ReDim Preserve aIPV4(UBound(aIPV4) - 1)
    21. If fIPV6 Then
    22. Return aIPV6
    23. Else
    24. Return aIPV4
    25. End If
    26. Catch ex As Exception
    27. Dim IPs() As System.Net.IPAddress = {System.Net.IPAddress.Parse("0")}
    28. If IsCompiled() Then
    29. MessageBox.Show(ex.Message & vbLf & System.Reflection.MethodBase.GetCurrentMethod().ToString, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    30. Return IPs
    31. Else
    32. Try
    33. My.Computer.FileSystem.WriteAllText(DebugFile, ex.Message & vbLf & System.Reflection.MethodBase.GetCurrentMethod().ToString, True)
    34. Return IPs
    35. Catch ex2 As Exception
    36. Return IPs
    37. End Try
    38. End If
    39. End Try
    40. End Function



    Mit dieser "alten" Funktion, geht bei mir alles. Nur habe ich ein etwas seltsames Gefühl dabei, weil der Befehl "alt" sei.
    Und da dieser funktioniert, sollte doch mit der DNS Einstellung alles i.O. sein!?

    Hat jemand noch eine Idee?

    Danke + Viele Grüsse
    Veronesi



    Edit: Nach dem Absenden des Themas ist jedes Mal die Formatierung von VB defekt! Weiss jemand warum? (IE 10 neueste Updates)
    @Jada: Was soll ich mir durchlesen? :)
    @ Lightsource: Ja, das ist ohne Fehlermeldung durchgegangen. Aber ich kanns ja nochmals darüber installieren. Denke allerdings nicht, dass es viel bringt.
    Leider geht die Ursprüngliche Methode auch nach dem Neuinstallieren des .NET nicht!
    Ich habe es sogar mit dem M$ .Net Repair Tool versucht. Leider Fehlanzeige.

    Ich werde nun momentan den "Obsolete" Befehl verwenden.

    Trotzdem Danke an Alle!
    Ich lasse den Thread mal noch offen, falls jemand noch eine Idee dazu hat.

    Veronesi
    SocketException liefert einen ErrorCode zurück. Fängt diesen ab, um weitere Infos zu bekommen.
    Beispiel:

    VB.NET-Quellcode

    1. Dim machineName = Net.Dns.GetHostName
    2. Dim hostEntry = Net.Dns.GetHostEntry(machineName)
    3. Try
    4. For Each addr In hostEntry.AddressList
    5. Debug.Print("AddressTyp: {0}; Address: {1}", addr.AddressFamily.ToString.PadRight(20, "."c), addr.ToString)
    6. Next
    7. Catch ex As Net.Sockets.SocketException
    8. Debug.Print("Error: '{0}'; ErrorMessage: {1}", ex.SocketErrorCode.ToString, ex.Message)
    9. Catch ex As Exception
    10. Debug.Print("Error: {0}", ex.Message)
    11. End Try
    Hallo xtts02

    Der Fehler wird eben schon beim Befehl GetHostEntry(machineName) erzeugt.
    Demzufolge reicht dieser Code um den Fehler zu provozieren:

    VB.NET-Quellcode

    1. Dim machineName = Net.Dns.GetHostName
    2. Dim hostEntry As System.Net.IPHostEntry
    3. Try
    4. hostEntry = Net.Dns.GetHostEntry(machineName)
    5. Catch ex As Exception
    6. Debug.WriteLine(ex.ToString)
    7. End Try


    Die Fehlermeldung, die ich dabei erhalte ist folgende:
    Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
    System.Net.Sockets.SocketException: Beim Datenbankaufruf ist ein nicht behebbarer Fehler aufgetreten
    bei System.Net.Dns.GetAddrInfo(String name)
    bei System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
    bei System.Net.Dns.GetHostEntry(String hostNameOrAddress)
    bei test.Main.Main() in U:\9_Programming\VB\_Uebungen\test\test\Main.vb:Zeile 7.


    Gruss, Veronesi



    Edit by LaMa5:
    - Die Farbe ROT ist für moderative Zwecke vorbehalten (Boardregeln §4.3c)
    --> Farbgebung angepasst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Hallo xtts02

    Ja, ich habe nun ja den Fehler.
    Der Fehler ist, dass er den Befehl Net.Dns.GetHostEntry(machineName) nicht erfolgreich ausführen kann.
    Die Fehlermeldung habe ich ja schon vorher gepostet.

    Aber wie kann ich den Fehler beheben?
    Ich will ihn ja nicht nur abfangen, sondern er soll gar nicht auftauchen. Denn auf über 295 PCs läuft er inzwischen einwandfrei durch. Bloss auf 2 PCs nicht.

    Veronesi
    Hallo!

    Da ich in dieser Programmiersprache (und im programmieren allgemein) noch ein Niemand bin, müsst ihr mir etwas mehr helfen als üblich.
    Ich nehme folgenden Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Module Main
    3. Sub Main()
    4. Dim machineName = Net.Dns.GetHostName
    5. Debug.WriteLine(machineName)
    6. Dim hostEntry As System.Net.IPHostEntry
    7. Try
    8. hostEntry = Net.Dns.GetHostEntry(machineName)
    9. Catch ex As Exception
    10. Debug.WriteLine(ex.ToString)
    11. End Try
    12. End Sub
    13. End Module


    Dabei erhalte ich folgende Ausgabe:
    WEYNB00761
    Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
    System.Net.Sockets.SocketException: Beim Datenbankaufruf ist ein nicht behebbarer Fehler aufgetreten
    bei System.Net.Dns.GetAddrInfo(String name)
    bei System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
    bei System.Net.Dns.GetHostEntry(String hostNameOrAddress)
    bei test.Main.Main() in U:\9_Programming\VB\_Uebungen\test\test\Main.vb:Zeile 8.
    Der Thread 'vshost.RunParkingWindow' (0x4b4) hat mit Code 0 (0x0) geendet.
    Der Thread '<Kein Name>' (0xed4) hat mit Code 0 (0x0) geendet.
    Das Programm "[2248] test.vshost.exe: Verwaltet (v2.0.50727)" wurde mit Code 0 (0x0) beendet.


    Ich weiss leider nicht, wie ich an einen ErrorCode komme.
    ex.ErrorCode.ToString gibt's nämlich nicht :)

    Ich gebe alle Daten preis, die Ihr benötigt, aber ich muss schon wissen, wie ich an diese Daten komme!

    Veronesi
    Hallo xtts02

    Aber gerade dieser Code aus Posting #11 nützt mir ja nichts!
    Weil bei der zweiten Zeile (Dim hostEntry = Net.Dns.GetHostEntry(machineName))
    fliegt er ja schon raus. Und dort ist kein Try...Catch....!
    Also bekomme ich nie einen Fehlercode!

    Siehe auch Anhang.

    Veronesi

    EDIT:
    Sorry, nun habe ich verstanden, was Du meinst.
    Ich verwende nun folgenden Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Module Main
    3. Sub Main()
    4. Dim machineName = Net.Dns.GetHostName
    5. Debug.WriteLine(machineName)
    6. Dim hostEntry As System.Net.IPHostEntry
    7. Try
    8. hostEntry = Net.Dns.GetHostEntry(machineName)
    9. Catch ex As Net.Sockets.SocketException
    10. Debug.Print("Error: '{0}'; ErrorMessage: {1}", ex.SocketErrorCode.ToString, ex.Message)
    11. Catch ex As Exception
    12. Debug.Print("Error: {0}", ex.Message)
    13. End Try
    14. End Sub
    15. End Module

    Nun bekomme ich folgende Meldung:
    WEYNB00761
    Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
    Error: 'NoRecovery'; ErrorMessage: Beim Datenbankaufruf ist ein nicht behebbarer Fehler aufgetreten
    Der Thread 'vshost.RunParkingWindow' (0x9bc) hat mit Code 0 (0x0) geendet.
    Der Thread '<Kein Name>' (0x1228) hat mit Code 0 (0x0) geendet.
    Das Programm "[4592] test.vshost.exe: Verwaltet (v2.0.50727)" wurde mit Code 0 (0x0) beendet.
    Bilder
    • Error.png

      82,21 kB, 1.122×812, 256 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Veronesi“ ()