IP-Scanner Algorithmus

  • Hallo zusammen!

    Habe grade voll den logischen Denkfehler. ich will mir einen Algorithmus programmieren, mit dem ich IP-Ranges (z.B.: von 192.0.0.1 - 192.168.0.0) scannen kann.
    Folgenden Code habe ich bisher geschrieben:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    _ArrayDisplay(_PingAll("192.0.0.1", "192.168.0.1", 25, 0, 0))

    [/autoit] [autoit][/autoit] [autoit]

    Func _PingAll(Const $S_IPSTART, Const $S_IPEND, Const $_TIMEOUT = 4000, Const $I_GETNAME = 0, Const $I_GETMAC = 0)
    Local $a_ret[20480][4]
    Local $i = 1
    $a_startip = StringSplit($S_IPSTART, ".", 1)
    $a_endip = StringSplit($S_IPEND, ".", 1)
    For $i_first = $a_startip[1] To 255
    If $i_first > $a_endip[1] Then ExitLoop
    For $i_second = $a_startip[2] To 255
    If $i_second > $a_endip[2] Then ExitLoop
    For $i_third = $a_startip[3] To 255
    If $i_third > $a_endip[3] Then ExitLoop
    For $i_fourth = $a_startip[4] To 255
    $a_ret[$i][0] = $i_first & "." & $i_second & "." & $i_third & "." & $i_fourth
    ;~ MsgBox(0, "", "Fourth: " & $i_fourth & @CR & "End: " & $a_endip[4] & @CR & $a_ret[$i][0])
    If $i_fourth > $a_endip[4] Then
    ;~ Hier fehlt die entscheidende Überprüfung!
    ExitLoop
    EndIf
    ;~ $a_ret[$i][1] = Ping($a_ret[$i][0], $_TIMEOUT)
    ;~ If Not @error Then
    ;~ $a_ret[$i][2] = _TCPIpToName($a_ret[$i][0])
    ;~ $a_ret[$i][3] = _IpToMac($a_ret[$i][0])
    ;~ EndIf
    $i += 1
    Next
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $a_ret[0][0] = $i - 1
    ReDim $a_ret[$i][4]

    [/autoit] [autoit][/autoit] [autoit]

    Return ($a_ret)
    EndFunc ;==>_PingAll

    [/autoit]

    Das Problem ist die Zusammensetzung der Schleifen, da er ja in Abhängigkeit des jeweiligen Oktetts fortfahren muss oder nicht. Vielleicht kann mir ja jemand weiterhelfen!

  • lol, danke, aber das habe ich mir bereits angeschaut. Soweit das Ganze zu machen ist ja (relativ) leicht. Mit Deinem Skript kann man ja nur das letzte Oktett scannen. Ich möchte einen Algorithmus, der mich von 0.0.0.0 bis 255.255.255.255 scannen lässt.

    Würde daraus dann ganz gerne eine UDF bauen.

    • Offizieller Beitrag

    Hallo

    Hä?^^ bin ich im Falschen Thread? War grade vor mir nicht noch ein post?! :P Und das mit _PingAll hab ich nich gesehen, sry *rotwerd*

    Habe mal was für dich geproggt, meinst du sowas?:

    Spoiler anzeigen
    [autoit]


    $from = "0.0.0.0"
    $to = "5.5.5.5"

    [/autoit] [autoit][/autoit] [autoit]

    $from = StringSplit($from, ".")
    $to = StringSplit($to, ".")
    If $from[0] < 4 Or $to[0] < 4 Then Exit MsgBox(0, "", "IP Muss so aussehen xxx.xxx.xxx.xxx")
    For $1 = $from[1] To $to[1]
    For $2 = $from[2] To $to[2]
    For $3 = $from[3] To $to[3]
    For $4 = $from[4] To $to[4]
    $ip = $1 & "." & $2 & "." & $3 & "." & $4
    If _StringIPTypeValid($ip) Then ConsoleWrite($ip & @CRLF)
    Next
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;By Smoke_N
    Func _StringIPTypeValid($sIP)
    If StringRegExp($sIP, "(?:(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(\.)){3}(?:(25[0-5]$|2[0-4]\d$|1\d{2}$|[1-9]\d$|\d$))") Then Return 1
    Return SetError(1, 0, 0)
    EndFunc ;==>_StringIPTypeValid

    [/autoit]

    Mfg Spider

    • Offizieller Beitrag

    GtaSpider : Mit deinem Muster wird aber nicht das jeweilige Oktett komplett durchlaufen.
    P.S. Ich hatte vor dir nen Post. Hatte ich aber wegen eines Fehlers wieder gekillt.

    Hier mal mein Vorschlag, nachdem ich ein paar Knoten im Hirn gelöst hatte funktioniert es nun auch. :D

    Spoiler anzeigen
    [autoit]

    ; generiert alle möglichen Adressen zwischen 192.166.250.1 und 192.168.0.1 ($s1.$s2.$s3.$s4 bis $e1.$e2.$e3.$e4)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $s1 = 192, $e1 = 192
    Dim $s2 = 166, $e2 = 168
    Dim $s3 = 250, $e3 = 0
    Dim $s4 = 1, $e4 = 1
    Dim $start2 = $s2, $start3 = $s3, $start4 = $s4

    [/autoit] [autoit][/autoit] [autoit]

    For $1 = $s1 To $e1
    If $1 <> $e1 Then
    $end2 = 255
    If $1 <> $s1 Then $start2 = 0
    Else
    $end2 = $e2
    EndIf
    For $2 = $start2 To $end2
    If ( $2 <> $e2 Or $1 <> $e1 ) Then
    $end3 = 255
    If $2 <> $s2 Then $start3 = 0
    Else
    $end3 = $e3
    EndIf
    For $3 = $start3 To $end3
    If ( $3 <> $e3 Or $2 <> $e2 Or $1 <> $e1 ) Then
    $end4 = 255
    If $3 <> $s3 Then $start4 = 0
    Else
    $end4 = $e4
    EndIf
    For $4 = $start4 To $end4
    ConsoleWrite($1 &'.'& $2 &'.'& $3 &'.'& $4 & @CRLF)
    Next
    Next
    Next
    Next

    [/autoit]

    Edit: Ich habe die Generierung der IP's mal in eine Funktion gepackt.

    Spoiler anzeigen
    [autoit]

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _GenerateIPsInRange($IPstart, $IPend)
    ;
    ; Description Generate all possible IP's between $IPstart and $IPend and write in an array
    ;
    ; Parameter $IPstart 1st Ip in range
    ; $IPend last Ip in range
    ;
    ; Return Succes Array 1D with all generated IP's
    ; Failure 0 and set @error 1 : given IP not correct
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _GenerateIPsInRange($IPstart, $IPend)
    Local $pattern = '(\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.'& _
    '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)'
    If ( Not StringRegExp($IPstart, $pattern, 0) Or _
    Not StringRegExp($IPend, $pattern, 0) ) Then
    SetError(1)
    Return 0
    EndIf
    $var = StringSplit($IPstart, '.')
    Local $s1 = $var[1], $s2 = $var[2], $s3 = $var[3], $s4 = $var[4]
    $var = StringSplit($IPend, '.')
    Local $e1 = $var[1], $e2 = $var[2], $e3 = $var[3], $e4 = $var[4]
    Local $start2 = $s2, $start3 = $s3, $start4 = $s4
    Local $arOut[1] = [0]
    For $1 = $s1 To $e1
    If $1 <> $e1 Then
    $end2 = 255
    If $1 <> $s1 Then $start2 = 0
    Else
    $end2 = $e2
    EndIf
    For $2 = $start2 To $end2
    If ( $2 <> $e2 Or $1 <> $e1 ) Then
    $end3 = 255
    If $2 <> $s2 Then $start3 = 0
    Else
    $end3 = $e3
    EndIf
    For $3 = $start3 To $end3
    If ( $3 <> $e3 Or $2 <> $e2 Or $1 <> $e1 ) Then
    $end4 = 255
    If $3 <> $s3 Then $start4 = 0
    Else
    $end4 = $e4
    EndIf
    For $4 = $start4 To $end4
    If $arOut[0] = 0 Then
    $arOut[0] = $1 &'.'& $2 &'.'& $3 &'.'& $4
    Else
    ReDim $arOut[UBound($arOut)+1]
    $arOut[UBound($arOut)-1] = $1 &'.'& $2 &'.'& $3 &'.'& $4
    EndIf
    Next
    Next
    Next
    Next
    Return $arOut
    EndFunc ;==>_GenerateIPsInRange

    [/autoit]
  • Hi , denke aber daran das du nicht einfach die IP Adressen so scannen kannst.
    Die IP - Adressen hängen fest mit der Subnetmaske zusammen.

    192.0.0.0 geht bis 192.255.255.255 und hat die Subnetmask 255.255.255.0 oder es ist ein A oder B netz ...


    B-Netz = 255.255.0.0
    A-Netz = 255.0.0.0

    192.0.0.0 ist bis 192.167.255.255 eigentlich auch als C-Netz Öffentliche IP das Heißt folglich das diese IP - Adressen auch von einem Router geroutet werden würden ;) und du Plötzlich Rechner finden würdest die garnicht zu deinem Netzwerk gehören...

    Privates Netzwerk ist 192.168.0.0 /24 sprich bis 192.168.255.255 in C netzwerk.

    *Edit*
    Nachtrag :

    Noch zur weiteren Info...

    Wenn dein Rechner (Scanner) die IP 192.168.0.25 /24 hat, Sprich
    IP : 192.168.0.25
    Subnet: 255.255.255.0

    Wird es schwer in höhere Netzwerke wie

    IP : 192.168.1.25
    Subnet: 255.255.255.0

    zu Scannen da dieses Netzwerke Physicalisch getrennt sind ;)

    Zur näheren Begutachtung, Die Subnetzmaske bestimmt den Netzwerk und Rechnerteil durch die Bit's

    die Subnetmaske 255.255.255.0
    in Binär 1111 1111 . 1111 1111 . 1111 1111 . 0000 0000

    die Einsen bestimmen den Netzwerkteil und setzen somit das Netzwerk fest das einzigste was sich bei einer IP noch ändern lassen würde wäre die letzten 3 ziffern .

    Um von Netzwerk 192.168.0.0 /24 im Netzwerk 192.168.1.0 /24 nen Rechner zu sehen bräuchtest du einen Router der die Netzwerke und DHCP / DNS kennt .

    Gruß

    Wenn ich zufällig irgend nen namen hostteil und netzwerkteil oder so vertauscht haben sollte sorry schrieb das gerade aussem kopf :D

    2 Mal editiert, zuletzt von Agent00 (29. August 2007 um 20:13)

    • Offizieller Beitrag

    Ich denke mal, ein tatsächlicher Scan in allen Oktetts ist auch nicht das Ziel.
    (Schon allein das Erstellen aller Adressen von 0.0.0.0 bis 255.255.255.255 dauert auf einem 'normalschnellen' PC mindestens 12 Stunden.)

    Wichtig war nur einen Algorithmus zu finden, der berücksichtigt, dass innerhalb eines Oktetts nach 255 wieder ab 0 gezählt wird.

  • Hi,
    Ja mag sein, aber wenn du dir das ganz einfach machen möchtest ohne viel Rechnerrei der Maschiene Sendest du einfach an die Brodcast Addresse der Netzwerke z.b. 192.168.0.255 / 24 dann Antworten Tehoretisch alle Angeschalteten Rechner so macht das auch der DHCP Server und dieser Vergibt dann die Netzwerk Addressen von der letzten Vergebenenen +1
    Sprich 192.168.0.2 ist vergeben dann gibt er der anderen Maschiene 192.168.0.3 usw.

    Kann sein das ich das nicht genau gelesen habe , sorry aber das sollte man beim Scannen ja auch berücksichtigen ....

    Gruß

  • So, ich meld mich auch mal wieder zu Wort:

    GtaSpider : Macht ja nichts. Hätte ich in meinem ersten Post ja auch schon erwähnen können, war bloß schreibfaul! :P
    Dein Code macht leider nicht das richtige, da ja nur jedes Oktett "von"-"bis" verglichen wird und dann nur soweit gezählt wird.
    Bei Start: 192.168.0.1 und Ende: 192.168.0.254 wird z.B. gar nichts gemacht, da das letzte Start-Oktett niedriger als das letzte Ende-Oktett ist und er in dem Fall Probleme in der letzten FOR-Schleife bekommt.

    BugFix : Geile Sache!!! Genau das ist es, was ich gesucht habe. Deine UDF scheint aber einen Fehler zu haben (habe jetzt nicht weiter nachgeschaut). Hab Deine UDF jetzt aus dem ersten Code erstellt und noch dem Array-Index0 die Anzahl der generierten IPs hinzugefügt, plus eine etwas erweiterte Überprüfung der IPs hinzugefügt. Zudem habe ich die Funktion in _IpGenerateRange umbenannt, da alle meine IP-Funktionen mit _Ip... beginnen.

    _IpRangeToAddresses: und mehr... :D (Vielen Dank, an alle die etwas dazu beigetragen haben!!!)

    Spoiler anzeigen
    [autoit]

    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _IpGenerateRange
    UDF Version.......: 1.1
    Change Date.......: 2007-08-29
    UDF Description...: Generate all possible IPv4 addresses between two IP addresses.

    [/autoit] [autoit][/autoit] [autoit]

    Author(s).........: BugFix <[email='bugfix@autoit.de'][/email]>
    Modified by teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    Company...........: none
    URL...............: http://www.autoit.de/

    [/autoit] [autoit][/autoit] [autoit]

    Parameter(s)......: $S_SIP - String containing an IPv4 address to begin with.
    $S_EIP - String containing an IPv4 address to end with.
    Return Value......: Success: Returns an one-dimensional array:
    $a_ips[0] = Contains the count of generated IP addresses.
    $a_ips[1...n] = Contains the IP addresses.
    Failure: Returns 0 and sets @error = 1 if IP address(es) are invalid.

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version....: 3.2.6.0
    Note(s)...........: none
    #ce ----------------------------------------------------------------------------
    Func _IpGenerateRange(Const $S_SIP, Const $S_EIP)
    If Not _IsIPv4($S_SIP) Or Not _IsIPv4($S_EIP) Then Return (SetError(1, 0, 0))

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $A_SIPS = StringSplit($S_SIP, ".")
    Local $i_s2 = $A_SIPS[2], $i_s3 = $A_SIPS[3], $i_s4 = $A_SIPS[4]
    Local Const $A_EIPS = StringSplit($S_EIP, ".")
    Local $i_e2 = 0, $i_e3 = 0, $i_e4 = 0
    Local $a_ips[1] = [0]

    [/autoit] [autoit][/autoit] [autoit]

    For $1 = $A_SIPS[1] To $A_EIPS[1]
    If $1 <> $A_EIPS[1] Then
    $i_e2 = 255
    If $1 <> $A_SIPS[1] Then $i_s2 = 0
    Else
    $i_e2 = $A_EIPS[2]
    EndIf
    For $2 = $i_s2 To $i_e2
    If $2 <> $A_EIPS[2] Or $1 <> $A_EIPS[1] Then
    $i_e3 = 255
    If $2 <> $A_SIPS[2] Then $i_s3 = 0
    Else
    $i_e3 = $A_EIPS[3]
    EndIf
    For $3 = $i_s3 To $i_e3
    If $3 <> $A_EIPS[3] Or $2 <> $A_EIPS[2] Or $1 <> $A_EIPS[1] Then
    $i_e4 = 255
    If $3 <> $A_SIPS[3] Then $i_s4 = 0
    Else
    $i_e4 = $A_EIPS[4]
    EndIf
    For $4 = $i_s4 To $i_e4
    $i_ips = UBound($a_ips)
    ReDim $a_ips[$i_ips + 1]
    $a_ips[$i_ips] = $1 & "." & $2 & "." & $3 & "." & $4
    Next
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $a_ips[0] = $i_ips
    Return ($a_ips)
    EndFunc ;==>_IpGenerateRange

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _IpToMac
    UDF Version.......: 1.1
    Change Date.......: 2007-08-28
    UDF Description...: Converts an IP address to MAC address.

    [/autoit] [autoit][/autoit] [autoit]

    Author(s).........: gtaspider <[email='gtaspider@autoit.de'][/email]>
    Modified by teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    Company...........: none
    URL...............: http://www.gtaspider.de/

    [/autoit] [autoit][/autoit] [autoit]

    Parameter(s)......: $S_IP - String containing an IPv4 address.
    Return Value......: Success: Returns string containing MAC address corresponding to the IPv4 address.
    Failure: Returns 00:00:00:00:00:00 if IPv4 address could not be converted.

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version....: 3.2.6.0
    Note(s)...........: none
    #ce ----------------------------------------------------------------------------
    Func _IpToMac(Const $S_IP)
    Local $struct_macstr = DllStructCreate("byte[6]")
    Local $struct_macsize = DllStructCreate("int")
    DllStructSetData($struct_macsize, 1, 6)

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_return = DllCall("Ws2_32.dll", "int", "inet_addr", "str", $S_IP)
    $a_return = DllCall("iphlpapi.dll", "int", "SendARP", "int", $a_return[0], "int", 0, "ptr", DllStructGetPtr($struct_macstr), "ptr", DllStructGetPtr($struct_macsize))

    [/autoit] [autoit][/autoit] [autoit]

    Local $s_macaddress = ""
    For $i = 0 To 5
    If $i Then $s_macaddress &= ":"
    $s_macaddress &= Hex(DllStructGetData($struct_macstr, 1, $i + 1), 2)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $struct_macstr = 0
    $struct_macsize = 0
    Return ($s_macaddress)
    EndFunc ;==>_IpToMac

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _IpToName
    UDF Version.......: 1.1
    Change Date.......: 2007-08-28
    UDF Description...: Converts an IPv4 address to Hostname.

    [/autoit] [autoit][/autoit] [autoit]

    Author(s).........: gtaspider <[email='gtaspider@autoit.de'][/email]>
    Modified by teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    Company...........: none
    URL...............: http://www.gtaspider.de/

    [/autoit] [autoit][/autoit] [autoit]

    Parameter(s)......: $S_IP - String containing an IPv4 address.
    $I_PING - Integer specifying whether to ping the IPv4 address before or not.
    0 = (default) Do not ping the IPv4 address before.
    1 = Ping the IPv4 address before.
    Return Value......: Success: Returns string containing Hostname corresponding to the IPv4 address.
    Failure: Returns 0
    When the function fails @error contains extended information:
    1 = The host with the specified IP address is currently offline.
    2 = Could not convert the IPv4 address.
    3 = Could not run "nbtstat.exe".

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version....: 3.2.6.0
    Note(s)...........: Requires: "nbtstat.exe"
    #ce ----------------------------------------------------------------------------
    Func _IpToName(Const $S_IP, Const $I_PING = 0)
    If $I_PING Then
    If Not Ping($S_IP, 50) Then Return (SetError(1, 0, 0))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $I_PID = Run(@ComSpec & " /c nbtstat.exe -a " & $S_IP, @SystemDir, @SW_HIDE, 2)
    If @error Then Return (SetError(3, 0, 0))

    [/autoit] [autoit][/autoit] [autoit]

    Local $s_outread = ""
    While 1
    $s_outread &= StdoutRead($I_PID)
    If @error Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $A_OUTREAD = StringSplit($s_outread, @CRLF)
    For $i = 1 To $A_OUTREAD[0]
    If StringInStr($A_OUTREAD[$i], "---------------------------------------------") Then
    $s_outread = StringTrimLeft($A_OUTREAD[$i + 3], 4)
    Return (StringLeft($s_outread, StringInStr($s_outread, " ") - 1))
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return (SetError(2, 0, 0))
    EndFunc ;==>_IpToName

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _IpRangeToAddresses
    UDF Version.......: 1.0
    Change Date.......: 2007-08-29
    UDF Description...: Pings a host-range and returns the IPv4 address and the roundtrip-time
    (optional plus Hostnames and MAC address).

    [/autoit] [autoit][/autoit] [autoit]

    Author(s).........: teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    Company...........: none
    URL...............: http://www.autoit.de/

    [/autoit] [autoit][/autoit] [autoit]

    Parameter(s)......: $I_IPS - Array containing an IPv4 address-range.
    Return Value......: Success: Returns an one-dimensional array:
    $a_ret[0][0] = Contains the IPv4 address-range count.
    $a_ret[1...n][1] = Contains the roundtrip-times.
    $a_ret[1...n][2] = Contains the Hostnames.
    $a_ret[1...n][3] = Contains the MAC addresses.
    Failure: Returns 0 if $I_IPS is not an array (@error = 1).

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version....: 3.2.6.0
    Note(s)...........: none
    #ce ----------------------------------------------------------------------------
    Func _IpRangeToAddresses(ByRef Const $i_ips, Const $_TIMEOUT = 4000, Const $I_NAME = 0, Const $I_MAC = 0)
    If Not IsArray($i_ips) Then Return (SetError(1, 0, 0))

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_ret[$i_ips[0] + 1][4]
    For $i = 1 To $i_ips[0]
    $a_ret[$i][0] = $i_ips[$i]
    $a_ret[$i][1] = Ping($a_ret[$i][0], $_TIMEOUT)
    If Not @error Then
    If $I_NAME Then $a_ret[$i][2] = _IpToName($a_ret[$i][0])
    If $I_MAC Then $a_ret[$i][3] = _IpToMac($a_ret[$i][0])
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $a_ret[0][0] = $i - 1
    Return ($a_ret)
    EndFunc ;==>_IpRangeToAddresses

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _IsIPv4
    UDF Version.......: 1.1
    Change Date.......: 2007-08-28
    UDF Description...: Checks for a valid IPv4 address.

    [/autoit] [autoit][/autoit] [autoit]

    Author(s).........: Thorsten Willert <[email='thorsten.willert@gmx.de'][/email]>
    Company...........: none
    URL...............: http://thorsten-willert.de/

    [/autoit] [autoit][/autoit] [autoit]

    Parameter(s)......: $S_IP - String containing an IPv4 address.
    Return Value......: Success: Returns 1
    Failure: Returns 0 and sets @error = 1 if IP address is invalid.

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version....: 3.2.6.0
    Note(s)...........: none
    #ce ----------------------------------------------------------------------------
    Func _IsIPv4(Const $S_IP)
    If StringRegExp($S_IP, "\A(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])\z") Then Return (1)
    Return (SetError(1, 0, 0))
    EndFunc ;==>_IsIPv4

    [/autoit]


    Example:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $s_startip = "192.168.0.1"
    Local $s_endip = "192.168.0.11"
    Local $a_iprange = _IpGenerateRange($s_startip, $s_endip)
    _ArrayDisplay(_IpRangeToAddresses($a_iprange, 25, 1, 1), "_IpRangeToAddresses from: " & $s_startip & " to: " & $s_endip)

    [/autoit]

    @Agent00: Das was Du schreibst stimmt vom Grundsatz her. Mir ging es aber wirklich in erster Linie um den Algorithmus. Abfragen, ob das Scannen gewisser Ranges Sinn ergibt oder nicht, ließen sich ja auch noch außerhalb der Funktion integrieren! Deine Angaben zu den IP-Adressklassen stimmen leider nicht ganz:

    Klasse-C Adressen haben eine Standardsubnetzmaske von 255.255.255.0 (Hier sind die ersten drei Oktette der Netzanteil und das Vierte der Hostanteil). Dadurch, dass die ersten drei Bits fix sind, beginnt die Klasse-C IP-Range bei 192.0.0.0 und endet bei 223.255.255.255 (einfach alle Netzanteil-Bits auf 1 setzen).
    Das private IPs (d.h. IPs die nicht vom Router geroutet werden von 192.168.0.0/24 bis 192.168.255.255 gehen stimmt (bei einer Standardsubnetzmaske). Allerdings würde schon das Scannen von 192.168.0.0 (der Netzadresse) und 192.168.255.255 (der Broadcastadresse) keinen Sinn machen (es sei denn, es gelingt einem die Broadcastanwtort, die ja von jedem Host kommt, der den Broadcast empfängt, abzufangen [wüsste jetzt nicht, wie man das mit AutoIt bewerkstelligen könnte...] Das wäre doch noch mal eine Aufgabenstellung...)
    Ansonsten aber schöne Erklärung zur Thematik!

    Naja, auf jedenfall oben erst einmal die Funktionen, die soweit einwandfrei funktionieren. Wenn wir das Ganze noch performanter bekommen könnten, wräre das der Hammer!

    EDIT: Änderung an _IpRangeToAddresses: Abfragen für Hostname und MAC fehlten.

    Einmal editiert, zuletzt von teh_hahn (29. August 2007 um 23:22)

    • Offizieller Beitrag

    Hast recht, das war nicht optimal - naja, da war ich noch jung und ungeduldig :D.

    Hier eine überarbeitete und verbesserte Version.

    Spoiler anzeigen
    [autoit]

    ;-------------------------------------------------------------------------------------------------
    ; Function _GenerateIPsInRange($IPstart, $IPend, $iRetType=0, $sDelim=Default, $fBroadcast=False)
    ; Description Erstellt alle möglichen IP's zwischen $IPstart und $IPend
    ; Parameter $IPstart erste IP im Bereich
    ; $IPend letzte IP im Bereich
    ; $iRetType Return-Type 0-Array (Standard), 1-String, trennzeichenbasiert
    ; $sDelim Trennzeichen bei Stringausgabe, Default= Zeichen von Opt("GuiDataSeparatorChar")
    ; Return Succes Array 1D (Anzahl in $a[0]) oder String mit allen erstellten IP's
    ; Failure 0 und set @error 1 : übergebene IP nicht korrekt
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _GenerateIPsInRange($IPstart, $IPend, $iRetType=0, $sDelim=Default, $fBroadcast=False)
    If IsKeyword($sDelim) Then $sDelim = Opt("GuiDataSeparatorChar")
    Local $pattern = '(\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.'& _
    '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)'
    If ( Not StringRegExp($IPstart, $pattern, 0) Or _
    Not StringRegExp($IPend, $pattern, 0) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $var = StringSplit($IPstart, '.')
    Local $o1 = $var[1], $o2 = $var[2], $o3 = $var[3], $o4 = $var[4]
    $var = StringSplit($IPend, '.')
    Local $e1 = $var[1], $e2 = $var[2], $e3 = $var[3], $e4 = $var[4]
    Local $sOut = '', $start = 1, $end = 255
    If $fBroadcast Then
    $start = 0
    $end = 256
    EndIf
    While $o1 <= $e1
    While ($o2 <= $e2) Or ($o1 < $e1)
    If $o2 = $end Then
    $o1 += 1
    $o2 = $start
    EndIf
    While ($o3 <= $e3) Or ($o2 < $e2) Or ($o1 < $e1)
    If $o3 = $end Then
    $o2 += 1
    $o3 = $start
    EndIf
    While True
    $sOut &= $o1 &'.'& $o2 &'.'& $o3 &'.'& $o4 & $sDelim
    If ($o1 = $e1) And ($o2 = $e2) And ($o3 = $e3) And ($o4 = $e4) Then
    If $iRetType Then
    Return $sOut
    Else
    Return StringSplit(StringTrimRight($sOut, StringLen($sDelim)), $sDelim, 1)
    EndIf
    EndIf
    $o4 += 1
    If $o4 = $end Then
    $o3 += 1
    $o4 = $start
    EndIf
    WEnd
    WEnd
    WEnd
    WEnd
    EndFunc ;==>_GenerateIPsInRange

    [/autoit]

    Edit:
    - Broadcastadressen optional (Default ohne)
    - Rückgabearray enthält in $a[0] die Anzahl der Elemente

    Edit2:
    noch einen Bug gefixed

    • Offizieller Beitrag

    Ist vllt Ansichtssache, aber in Array [0] die Anzahl finde ich pers. schöner, aber das kann ich mir selber basteln.
    Was aber "optisch" noch zu verbessern scheint, ist, dass das letzte array-element leer ist

    Evtl. noch die IPs .0 und .255 (Broadcast) (optional?) filtern?

    Hiermit erledigt. :thumbup:

  • Hi BugFix,

    das hört sich nice an ... leider funktioniert es bei mir nicht recht (bzw evtl schon, aber folgendes problem).

    Jede Ziffer steht in einem einzelnen Array-Element, quasi jeden IP UNTEREINANDER.

    Ich rufe die Funktion wie folgt auf:

    [autoit]

    $Range = _GenerateIPsInRange("220.119.145.13", "220.119.146.13")
    _ArrayDisplay($Range)

    [/autoit]

    raus kommt ein Array mit über 3900 Elementen (richtig wären ca 256 von der vorherigen Version, davon müsste dann nochmal Broadcast raus).

  • Hey BugFix,

    vllt kannst du mir nochmal kurz helfen. Und zwar wollte ich in deine Funktion (sofern du es erlaubst), eine andere Funktion einbauen, um quasi Zeit zu sparen. Ich möchte nicht, dass er erst alle IPs erstelt, sondern nach jeder erstellten IP direkt damit arbeiten. wenn die Funktion durch ist, soll die nächste IP erstellt werden.

    Aber ich blicke in deinem Script irgendwie nicht, wo die einzelnen IP-Adressen fertig ausgegeben werden ;)