Ip-Ranges berechnen

  • VB.NET

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

    Ip-Ranges berechnen

    Guten Nacht, liebe Community.
    Ich habe folgendes Problem, zu dem mir jeglicher Ansatz fehlt. Ich möchte einen Portscanner schreiben, bzw bin schon fertig. Mir fehlt "nur" noch folgendes.

    Ich gebe eine Startip und eine Endip ein, z.b die 127.0.0.1 und die 127.0.1.4. Jetzt möchte ich daraus die ips berechnen die dazwischen liegen also die 127.0.0.2 127.0.0.3 ... 127.0.1.3.
    Wäre sehr nett, wenn mir da einer einen Lösungsansatz liefern könnte =)
    Lg
    hübsche knobelaufgabe :)

    VB.NET-Quellcode

    1. Private Function IP2Int(ByVal ip As String) As Integer
    2. Dim segments = (From s In ip.Split(".") Select Byte.Parse(s)).ToArray
    3. Array.Reverse(segments)
    4. Dim retval(0) As Integer
    5. Buffer.BlockCopy(segments, 0, retval, 0, 4)
    6. Return retval(0)
    7. End Function
    8. Private Function Int2IP(ByVal n As Integer) As String
    9. Dim src = New Integer() {n}
    10. Dim bytes(3) As Byte
    11. Buffer.BlockCopy(src, 0, bytes, 0, 4)
    12. Array.Reverse(bytes)
    13. Dim segments = bytes.Select(Function(b) b.ToString)
    14. Return String.Join(".", segments.ToArray)
    15. End Function
    16. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    17. Dim ip0 = "127.0.0.3"
    18. Dim ip1 = "127.0.1.2"
    19. For i = IP2Int(ip0) To IP2Int(ip1)
    20. Debug.WriteLine(Int2IP(i))
    21. Next
    22. End Sub
    Herzlichen Dank für die Lösung. Sie funktioniert auf jeden Fall. Werd dich iw. in den Credits erwähnen ! =)
    Aber jetzt mal um meine Neugierde zu stillen, könntest du den Code evt. noch ein wenig kommentieren bzw. erklären ich komm da nich ganz mit =)

    VB.NET-Quellcode

    1. Private Function IP2Int(ByVal ip As String) As Int32
    2. 'split zerteilt ip in 4 strings, die je eine Zahl darstellen
    3. 'Byte.Parse wandelt je ein Segment in ein Byte um
    4. 'Select sammelt diese Bytes in ein IEnumerable(Of Bytes)
    5. 'ToArray macht daraus ein Byte-Array
    6. Dim bytes = (From s In ip.Split(".") Select Byte.Parse(s)).ToArray
    7. Array.Reverse(bytes) 'dreht die Reihenfolge um
    8. Dim integers(0) As Int32 'ein Array von Int32 mit nur einem Element
    9. ' (ein Int32 ist genauso groß wie 4 Bytes)
    10. 'BlockCopy kann ein Array des einen Typs byte-weise umkopieren in ein Array eines anderen Typs
    11. 'kopiert also die 4 Bytes auf den Int32
    12. Buffer.BlockCopy(bytes, 0, integers, 0, 4)
    13. Return integers(0) 'den Int32 returnen
    14. End Function
    15. Private Function Int2IP(ByVal n As Integer) As String
    16. Dim integers = New Integer() {n} 'ein Array von Int32 mit nur dem einem Element
    17. Dim bytes(3) As Byte 'Array mit 4 Bytes
    18. Buffer.BlockCopy(integers, 0, bytes, 0, 4) 'den Int32 auf die 4 Bytes kopieren
    19. Array.Reverse(bytes) 'reihenfolge umdrehen
    20. 'Byte-Array in ein String-Array konvertieren
    21. Dim strings = bytes.Select(Function(b) b.ToString)
    22. 'Strings verketten und returnen
    23. Return String.Join(".", strings.ToArray)
    24. End Function
    25. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    26. Dim ip0 = "127.0.0.3"
    27. Dim ip1 = "127.0.1.2"
    28. 'Die Schleife zählt von der einen ip-Repräsentation zur anderen
    29. For i = IP2Int(ip0) To IP2Int(ip1)
    30. Debug.WriteLine(Int2IP(i)) 'zurückgewandelte ip-Repräsentationen ausgeben
    31. Next
    32. End Sub

    Evtl. wäre für den Portscanner sogar sinnvoll, eine IP-Klasse zu creiern, die beide Darstellungen einer IP eingebaut hat. So eine IP-Klasse könntedann eine "IsInRange"-funktion anbieten.

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