Auflösen mehrerer Hostnamen in ihre IP

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von HaRoWagner.

    Auflösen mehrerer Hostnamen in ihre IP

    Hallo zusammen,

    ich schreibe gerade ein Programm, das eine Liste von Hostnamen die in einer Textbox untereinander stehen in die IP Adresse auflöst.
    Ich habe zuvor schon mal eines geschrieben und nslookup verwendet, dies möchte ich jedoch nicht mehr. Im System.Net namespace gibts ja noch DNS.
    Damit habe ich aber ein kleines Problem. Einen Hostnamen auflösen geht wunderbar, bei einem Weiteren bekomme ich eine Fehlermeldung beim Ausführen des Programms:
    "SocketException wurde nicht behandelt. - Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden"

    Hier der Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim Lines() As String
    5. Lines = TextBox1.Text.Split(Environment.NewLine)
    6. For i As Integer = 0 To Lines.Length - 1
    7. Dim hostname As IPHostEntry = Dns.GetHostByName(Trim$(Lines(i)))
    8. Dim ip As IPAddress() = hostname.AddressList
    9. TextBox2.Text = ip(0).ToString()
    10. Next
    11. End Sub
    12. End Class

    In Zeile 8 wird die Textbox1, wo die Hostnamen untereinander drin stehen (ca. 200), Zeile für Zeile in das Array Lines() übertragen.Danach sollte die For-schleife den Rest erledigen. Der erste Host klappt noch, bei einem Weiteren kommt oben genannte fehlermeldung :(
    Könnt Ihr mir sagen was ich falsch gemacht habe?Vielen Dank im Voraus
    GrußBene
    Das scheint er ordentlich zu machen:

    VB.NET-Quellcode

    1. For i As Integer = 0 To Lines.Length - 1
    2. 'Dim hostname As IPHostEntry = Dns.GetHostByName(Trim$(Lines(i)))
    3. 'Dim ip As IPAddress() = hostname.AddressList
    4. 'TextBox2.Text = ip(0).ToString()
    5. MsgBox(Lines(i))
    6. Next


    er gibt nun jede Zeile einzeln korrekt und ohne Fehler in einer Textbox wieder.
    einzeln macht er das ja, aber sobald er den zweiten hostnamen in der Liste nimmt, tritt der fehler auf.
    Ich hatte zuerst nslookup verwendet in meinem früheren Programm und die entsprechenden Stellen herausschneiden lassen. Das ging bis auf einige Ausnahmen recht gut. Allerdings wollte ich es nun mit der DNS-Klasse lösen ;)
    Hey,

    erstmal mach OPTION STRICT ON, zweitens wirf die uralten VB Funktionen aus Deinem Code.

    Probier mal mit DNS.GetHostEntry. Hier ist ein Try-Catch glaub ich angebracht, da man einfach fangen muss, wenn ein ungültiger Host angegeben wird. Bei mir klappt es so einwandfrei, egal, wieviele Hosts ich auflösen will.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private _hostsToResolve As New List(Of String)
    4. Private _resolvedHosts As New Dictionary(Of String, List(Of IPAddress))
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. ResolveHosts()
    7. End Sub
    8. Private Sub ResolveHosts()
    9. For Each s As String In _hostsToResolve
    10. Try
    11. Dim entries As IPHostEntry = Dns.GetHostEntry(s)
    12. _resolvedHosts.Add(s, entries.AddressList.ToList())
    13. Catch ex As Sockets.SocketException
    14. _resolvedHosts.Add(s, Nothing)
    15. End Try
    16. Next
    17. End Sub
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    19. _hostsToResolve.AddRange({"google.de", "alternate.de", "vb-paradise.de", "youtube.com", "bbx,,,m,hnn.oo"})
    20. End Sub
    21. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hallo SpaceyX,

    erst einmal Danke für deine Hilfe ;) .
    Jedoch tun sich da bei mir ein paar Fragen auf:

    1. Funktioniert dies auch mit dem splitten der Textbox in ein array wie in meinem code?
    2. Irgendwie vermisse ich die Ausgabe der aufgelösten IP-Adressen. Er gibt irgendwie keine Rückmeldung was denn nun die IPs der aufgelösten hosts sind.

    Gedacht hatte ich es mir so, das, man in der ersten Textbox die Hosts hinein kopiert und nach dem klick auf den Button, er die dazugehörigen IP-Adressen in die Textbox 2 schreibt.

    Danke und viele Grüße
    Bene
    Hey,

    1. Wo Du Deine Eingabewerte herbekommst ist völlig egal. Entweder aus einer TextBox, Datenbank, was weiß ich.

    2. Die Ausgabe sollte eigentlich doch nur noch ne Kleinigkeit sein, findest nicht? TextBoxen halte ich hier nicht gerade für die erste Wahl, da ein Host mehrere zugeordnete IPs haben kann. Siehe YouTube, da sinds über 10. Ich würd das ganze in ein DataSet packen und in einem DataGridView darstellen.

    Wie gesagt, versuch Dich mal selber daran, die aufgelösten Hosts Deinen Wünschen nach auszugeben. Wenn Du nicht weiter kommst, dann poste hier einfach wieder.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hmm so ganz genau weis ich nicht wie ich aus den "_resolvedHosts" die IP raus bekomme (bin noch quasi Anfänger *g*), aber hier ist der Code soweit ich wusste:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private _hostsToResolve As New List(Of String)
    4. Private _resolvedHosts As New Dictionary(Of String, List(Of IPAddress))
    5. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    6. Dim Input() As String
    7. Dim i As Integer
    8. Input = TextBox1.Text.Split(Environment.NewLine)
    9. For i = 0 To Input.Length - 1
    10. Output.Rows(0).Cells(0).Value = Input(i)
    11. _hostsToResolve.AddRange({Trim$(Input(i))})
    12. ResolveHosts()
    13. Next
    14. End Sub
    15. Private Sub ResolveHosts()
    16. For Each s As String In _hostsToResolve
    17. Try
    18. Dim entries As IPHostEntry = Dns.GetHostEntry(s)
    19. _resolvedHosts.Add(s, entries.AddressList.ToList())
    20. Output.Rows(0).Cells(1).Value = entries.AddressList.ToString
    21. Catch ex As Sockets.SocketException
    22. _resolvedHosts.Add(s, Nothing)
    23. End Try
    24. Next
    25. End Sub
    26. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    27. '_hostsToResolve.AddRange({"google.de", "alternate.de", "vb-paradise.de", "youtube.com", "bbx,,,m,hnn.oo"})
    28. End Sub
    29. End Class


    beim Versuch _resolvedHosts auszugeben (z.b. msgbox(_resolvedHosts.Tostring) oder Textbox1.Text = _resolvedHosts.ToString) schreibt er komisches zeug, und ohne sagt er, das er das nicht in String umwandeln kann oO
    Hey,

    bin ein bisschen spät dran mit der Antwort, hatte zu tun.

    Also, wenn Du noch Anfänger bist, ist das alles wohl etwas "overkill" für Dich. Man kann diese Aufgabe auf vielen Wegen lösen. Ich poste Dir mal Code.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private Function ResovleHost(hostName As String) As List(Of IPAddress)
    4. Try
    5. Dim entries As IPHostEntry = Dns.GetHostEntry(hostName)
    6. Dim tmpList As New List(Of IPAddress)
    7. tmpList.AddRange(entries.AddressList)
    8. Return tmpList
    9. Catch ex As Sockets.SocketException
    10. Return Nothing
    11. End Try
    12. End Function
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. 'DataSet leeren.
    15. HostsDataSet1.HostsTable.Clear()
    16. Dim hosts As New List(Of String)
    17. 'Eingabe verarbeiten. Hosts werden mit "," getrennt und vorher noch alle Leerzeichen gelöscht.
    18. hosts.AddRange(TextBox1.Text.Trim().Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries))
    19. For Each s As String In hosts
    20. 'Temporäre Liste, die das Ergebnis der Abfrage hält.
    21. Dim tmpList = ResovleHost(s)
    22. 'Falls ein Ergebnis zurückgegeben wurde => verarbeiten.
    23. If Not tmpList Is Nothing AndAlso tmpList.Count > 0 Then
    24. 'IP Nr. 1 in der AddressList.
    25. Dim ip1 As String = tmpList(0).ToString()
    26. Dim moreIps As String = String.Empty
    27. 'Falls mehrere IPs mit dem Host verbunden sind, diese auch entsprechend verarbeiten.
    28. If tmpList.Count > 1 Then
    29. 'Hier werden die IPs in Strings gewandelt und wieder, mit einem Leerzeichen getrennt, zusammengefügt.
    30. moreIps = String.Join(" ", tmpList.GetRange(1, tmpList.Count - 2).ConvertAll(New Converter(Of IPAddress, String)(Function(ip) ip.ToString())).ToArray())
    31. End If
    32. 'Dem DataSet eine neue Row hinzfügen.
    33. HostsDataSet1.HostsTable.AddHostsTableRow(s, ip1, moreIps)
    34. Else
    35. 'Falls die Abfrage nicht erfolgreich war.
    36. HostsDataSet1.HostsTable.AddHostsTableRow(s, "Host konnte nicht aufgelöst werden", "")
    37. End If
    38. Next
    39. End Sub
    40. End Class


    Beachte bitte die Kommentare im Code, ich hab versucht, es so gut wie möglich zu erklären.

    Hier noch ein kleines Video, wie es arbeitet:

    [media]
    youtube.com/watch?v=JMTGvlKSRDo&feature=youtu.be
    [/vb]

    Ich würde das etwa so lösen, leider wirds für einen Anfänger etwas schwer zu verstehen sein ;(
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hey super, ich danke dir ;)

    Habs in der Zwischenzeit nochmal mit meinem ersten Programm versucht und dort, wie du angedeutet hast, mit nem DataGridView gearbeitet.
    Das läuft jetzt echt gut und es traten auch keine Fehler mehr auf. Glaub das lag auch teilweise daran, der er beim ständigen auslesen und reinschreiben in Textboxen nicht ganz sauber war.
    Hier der Code, nicht schön, aber funktioniert xD

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
    3. Dim Lines() As String
    4. Lines = TextBox1.Text.Split(Environment.NewLine)
    5. Dim i As Integer
    6. Output.Rows.Add(Lines.Length - 1)
    7. For i = 0 To Lines.Length - 1
    8. 'Getting IP-Adress
    9. Lines(i) = Trim$(Lines(i))
    10. Output.Rows(i).Cells(0).Value = Lines(i)
    11. Dim IP As String = ""
    12. Dim targettmp As String = ""
    13. Dim oInfo As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo("nslookup", " " & Lines(i))
    14. oInfo.UseShellExecute = False
    15. oInfo.ErrorDialog = False
    16. oInfo.CreateNoWindow = True
    17. oInfo.RedirectStandardOutput = True
    18. Dim p As Process = System.Diagnostics.Process.Start(oInfo)
    19. Dim oReader As System.IO.StreamReader = p.StandardOutput
    20. targettmp = Trim$(oReader.ReadToEnd())
    21. Dim Sep1 As String = Trim$(targettmp.LastIndexOf("Address:"))
    22. IP = Trim$(targettmp.Substring(Sep1 + 8, 16))
    23. If IP = "" Then
    24. Output.Rows(i).Cells(1).Value = "NO IP"
    25. Else
    26. Output.Rows(i).Cells(1).Value = IP
    27. End If
    28. oReader.Close()
    29. 'Getting Hostname
    30. Dim hostname2 As String = ""
    31. targettmp = ""
    32. Dim oInfo2 As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo("nslookup", " " & Output.Rows(i).Cells(1).Value)
    33. oInfo2.UseShellExecute = False
    34. oInfo2.ErrorDialog = False
    35. oInfo2.CreateNoWindow = True
    36. oInfo2.RedirectStandardOutput = True
    37. Dim p2 As Process = System.Diagnostics.Process.Start(oInfo)
    38. Dim oReader2 As System.IO.StreamReader = p2.StandardOutput
    39. targettmp = oReader2.ReadToEnd()
    40. Try
    41. Dim Sep2 As String = Trim$(targettmp.IndexOf("Name:"))
    42. Dim Sep3 As String = Trim$(targettmp.LastIndexOf("Address:"))
    43. targettmp = Trim$(targettmp.Substring(Sep2 + 5, Sep3 - Sep2 - 5))
    44. Sep2 = targettmp.IndexOf(".")
    45. hostname2 = Trim$(targettmp.Substring(0, Sep2))
    46. If hostname2 = "" Then
    47. Output.Rows(i).Cells(2).Value = "NO HOSTNAME"
    48. Else
    49. Output.Rows(i).Cells(2).Value = hostname2
    50. End If
    51. oReader.Close()
    52. Catch ex As Exception
    53. MsgBox(ex.Message)
    54. End Try
    55. 'Compare resolved Hostnames
    56. If Output.Rows(i).Cells(0).Value = Output.Rows(i).Cells(2).Value Then
    57. Output.Rows(i).Cells(3).Value = "OK"
    58. Else
    59. Output.Rows(i).Cells(3).Value = "MISMATCH"
    60. End If
    61. 'Output.Rows.Add()
    62. Next i
    63. End Sub
    64. Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click
    65. Me.Close()
    66. End Sub
    67. End Class

    Edit:Ich glaub so ganz hab ich noch nicht verstanden wie DataSets und DataGridViews funktionieren. wollte deinen Code grad testen und bekomme einen Fehler nicht beseitigt der da lautet:"HostsTable" ist kein Member von "System.Data.DataSet"
    ?(

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

    Hallo SpaceyX,

    klasse Dein Progrämmchen, aber ich bin trotzdem gleich über einen Fehler gestolpert.
    Liegt daran, dass ich hinter einem Komma immer ein Leerzeichen eingebe.

    SpaceyX schrieb:

    VB.NET-Quellcode

    1. 'Eingabe verarbeiten. Hosts werden mit "," getrennt und vorher noch alle Leerzeichen gelöscht.
    2. hosts.AddRange(TextBox1.Text.Trim().Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries))

    Die Funktion trimmt nur den String und splittet dann.
    So funktioniert es für mich:

    VB.NET-Quellcode

    1. hosts.AddRange(TextBox1.Text.Split(New String() {",", " "}, StringSplitOptions.RemoveEmptyEntries))


    Grüße,
    Haro