Problem mit langsamen PING

  • Hallo,

    Ich möchte einen ganzen IP-Raum durchpingen um zu sehen, welche PCs im Netzwerk sind und ob diese eingeschalten sind.

    Spoiler anzeigen
    [autoit]

    #include <Inet.au3>
    $ipRange = "192.168."
    $iniName = "NetzINI.ini"
    $timer = TimerInit()
    TCPStartup()
    $pcs=0
    For $ip1=0 To 1
    For $ip2=1 To 253
    $ping = Ping($ipRange&$ip1&"."&$ip2, 10)
    if ($ping > 0) Then
    $pcs=$pcs+1
    $IpToName = IniRead($iniName,"IpToName",$ipRange&$ip1&"."&$ip2,"x82")
    $IpToNameSuccess = IniRead($iniName,"IpToNameSuccess",$ipRange&$ip1&"."&$ip2,"x82")
    If ($IpToName=="x82" AND $IpToNameSuccess=="x82") Then
    $name = _TCPIpToName($ipRange&$ip1&"."&$ip2)
    IniWrite($iniName,"IpToName",$ipRange&$ip1&"."&$ip2,$name)
    If ($name<>"") Then
    IniWrite($iniName,"IpToNameSuccess",$ipRange&$ip1&"."&$ip2,1)
    Else
    IniWrite($iniName,"IpToNameSuccess",$ipRange&$ip1&"."&$ip2,0)
    EndIf
    EndIf
    Else
    IniDelete($iniName,"IpToName",$ipRange&$ip1&"."&$ip2)
    IniDelete($iniName,"IpToNameSuccess",$ipRange&$ip1&"."&$ip2)
    EndIf
    Next
    Next
    IniWrite($iniName,"PCsOnline","Online",$pcs)
    MsgBox(0,"","Es sind "&$pcs&" PCs online!"&@CRLF&"Zeit zum Scannen: "&(TimerDiff($timer)/1000)&" Sekunden")

    [/autoit]

    Jetzt dauert aber die Zeile mit dem Ping drinnen (Z11) ewig und komme so für 100 IP-Adressen auf etwa 75 Sekunden. Dabei interesiert den Befehl mein Timeout von 10ms wenig...

    Der _TCPIpToName() ist nicht daran schuld, den habe ich schon auskommentiert und dauert ebenso lange!

    Vielleicht findest ja jemand einen Fehler oder kann mir einen Tipp geben!? - Danke

    Einmal editiert, zuletzt von palmers7 (31. Mai 2013 um 08:51)

    • Offizieller Beitrag

    Das ist meines Wissens kein Fehler. Es wird der Systembefehl Ping verwendet und dem ist jedes Timeout völlig schnurz. Insofern ist mir der Timeout-Parameter rätselhaft.
    Vielleicht solltest du den Timeout über eine AdlibRegister-Funktion realisieren. Ruf einfach im Intervall des Timeouts die Pingfunktion mit der nächsten Adresse auf. Probier es aus, vllt. bringt dich das weiter.

  • Es wäre wohl wesentlich effizienter, wenn du auf allen PCs einen Client installierst und auf einem zentralen PC einen Server. Client und Server kommunizieren per TCP. Jeder Client meldet sich selbsständig am Server an oder ab bzw meldet sich in Intervallen, wenn er noch online ist. Dadurch weiß der Server immer welche PCs gerade online sind bzw. kann PCs die sich nicht innerhalb der festgesetzten Intervalle melden als offline markieren. Das ist zwar letztlich ein wenig aufwendiger zu programmieren, aber auch zuverlässiger und mit keiner Wartezeit verbunden.

    Wenn du unbedingt bei den 512 Pings bleiben willst bleibt dir meiner Meinung nach nur der Weg den Ping selbst in einen separaten Prozess auszulagern. Dadurch könntest du x Pings paralell ausführen, was die Zeit dementsprechend um Faktor x verkürzt. Allerdings musst du dir dann noch einfallen lassen, wie dein Hauptprogramm die Ergebnisse dieser separaten Prozesse bekommen soll (Kommunikation zwischen zwei Scripten). Letztlich ist diese Variante mindestens genauso aufwendig, wie wenn du gleich eine Client/Server Anwendung schreibst.

  • wenn dann mit "-w"
    -t ist für Dauerping

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o