IP range

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hallo Nutzer, ich arbeite gerade ein einem Server-tool,das bisher fasst fertig ist.
    Aber ich möchte da jetzt ein Funktion einbauen das alle IP´s zwischen 2 IP scannt und ihren online-status
    anzeigt, also ein IP range. Ich habe es bisher so gemacht, ich habe 2 ip in eine Textbox eingegeben, das programm berechnet alle möglichen ip´s und scannt die mit ping ab. Das dauert mir aber viel zu lange, gibt es das nicht einen direkten Weg ?

    Danke schonmal im vorraus
    ja aber ich mache es bisher so :

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.IO
    3. Public Class Form1
    4. Private Function IP2Int(ByVal ip As String) As Int32
    5. 'split zerteilt ip in 4 strings, die je eine Zahl darstellen
    6. 'Byte.Parse wandelt je ein Segment in ein Byte um
    7. 'Select sammelt diese Bytes in ein IEnumerable(Of Bytes)
    8. 'ToArray macht daraus ein Byte-Array
    9. Dim bytes = (From s In ip.Split(".") Select Byte.Parse(s)).ToArray
    10. Array.Reverse(bytes) 'dreht die Reihenfolge um
    11. Dim integers(0) As Int32 'ein Array von Int32 mit nur einem Element
    12. ' (ein Int32 ist genauso groß wie 4 Bytes)
    13. 'BlockCopy kann ein Array des einen Typs byte-weise umkopieren in ein Array eines anderen Typs
    14. 'kopiert also die 4 Bytes auf den Int32
    15. Buffer.BlockCopy(bytes, 0, integers, 0, 4)
    16. Return integers(0) 'den Int32 returnen
    17. End Function
    18. Private Function Int2IP(ByVal n As Integer) As String
    19. Dim integers = New Integer() {n} 'ein Array von Int32 mit nur dem einem Element
    20. Dim bytes(3) As Byte 'Array mit 4 Bytes
    21. Buffer.BlockCopy(integers, 0, bytes, 0, 4) 'den Int32 auf die 4 Bytes kopieren
    22. Array.Reverse(bytes) 'reihenfolge umdrehen
    23. 'Byte-Array in ein String-Array konvertieren
    24. Dim strings = bytes.Select(Function(b) b.ToString)
    25. 'Strings verketten und returnen
    26. Return String.Join(".", strings.ToArray)
    27. End Function
    28. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    29. End Sub
    30. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    31. Dim ip0 = TextBox1.Text
    32. Dim ip1 = TextBox2.Text
    33. 'Die Schleife zählt von der einen ip-Repräsentation zur anderen
    34. For i = IP2Int(ip0) To IP2Int(ip1)
    35. ListBox1.Items.Add(Int2IP(i)) 'zurückgewandelte ip-Repräsentationen ausgeben
    36. Next
    37. End Sub
    38. Private Sub statuscheck()
    39. If My.Computer.Network.Ping(ListBox1.SelectedItem) = True Then
    40. Else
    41. ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
    42. End If
    43. End Sub
    44. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    45. timer1.start()
    46. End Sub
    47. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    48. ListBox1.SelectedIndex += 1
    49. statuscheck()
    50. End Sub
    51. End Class


    aber das geht doch schneller oder anders oder ?
    Hi,
    schneller könntest du es u.U. machen, indem du Threads benutzt, welche dann jeweilige IPs anpingen. Dadurch würdest du dann eine parallele Verarbeitung erreichen. Ich bin mir dabei nur nicht sicher, ob das auch so eiwandfrei funktioniert. Aber ich denke der Grundgedanke sollte hinhauen.