Wieso interessiert Autoit mein timeout bei Ping nicht :-(

  • Hallo, laut diesem Script müsste das ganze Maximal eine Sekunde dauern... Leider dauert das erheblich länger, woran liegt das?

    Spoiler anzeigen
    [autoit]


    ProgressOn("IP ermitteln","Die IP's für die Computer werden ermittelt")
    TCPStartup()
    ProgressSet(5,"Rechner 1 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-01",50) Then $pcip1 = TCPNameToIP("wks-if3-01")
    ProgressSet(10,"Rechner 2 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-02",50) Then $pcip2 = TCPNameToIP("wks-if3-02")
    ProgressSet(15,"Rechner 3 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-03",50) Then $pcip3 = TCPNameToIP("wks-if3-03")
    ProgressSet(20,"Rechner 4 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-04",50) Then $pcip4 = TCPNameToIP("wks-if3-04")
    ProgressSet(25,"Rechner 5 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-05",50) Then $pcip5 = TCPNameToIP("wks-if3-05")
    ProgressSet(30,"Rechner 6 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-06",50) Then $pcip6 = TCPNameToIP("wks-if3-06")
    ProgressSet(35,"Rechner 7 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-07",50) Then $pcip7 = TCPNameToIP("wks-if3-07")
    ProgressSet(40,"Rechner 8 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-08",50) Then $pcip8 = TCPNameToIP("wks-if3-08")
    ProgressSet(45,"Rechner 9 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-09",50) Then $pcip9 = TCPNameToIP("wks-if3-09")
    ProgressSet(50,"Rechner 10 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-10",50) Then $pcip10 = TCPNameToIP("wks-if3-10")
    ProgressSet(55,"Rechner 11 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-11",50) Then $pcip11 = TCPNameToIP("wks-if3-11")
    ProgressSet(60,"Rechner 12 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-12",50) Then $pcip12 = TCPNameToIP("wks-if3-12")
    ProgressSet(65,"Rechner 13 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-13",50) Then $pcip13 = TCPNameToIP("wks-if3-13")
    ProgressSet(70,"Rechner 14 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-14",50) Then $pcip14 = TCPNameToIP("wks-if3-14")
    ProgressSet(75,"Rechner 15 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-15",50) Then $pcip15 = TCPNameToIP("wks-if3-15")
    ProgressSet(80,"Rechner 16 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-16",50) Then $pcip16 = TCPNameToIP("wks-if3-16")
    ProgressSet(85,"Rechner 17 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-17",50) Then $pcip17 = TCPNameToIP("wks-if3-17")
    ProgressSet(90,"Rechner 18 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-18",50) Then $pcip18 = TCPNameToIP("wks-if3-18")
    ProgressSet(95,"Rechner 19 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-19",50) Then $pcip19 = TCPNameToIP("wks-if3-19")
    ProgressSet(100,"Rechner 20 / 20","Die IP's für die Computer werden ermittelt")
    If Ping("wks-if3-20",50) Then $pcip20 = TCPNameToIP("wks-if3-20")
    TCPShutdown()
    ProgressOff()

    [/autoit]


    Ich glaube AutoIT mag mich nicht mehr... ;(;(;(

  • Hallo Jonathan,

    die TimeOutzeit für die 20 Pings ergeben zwar zusammen maximal 1 Sekunde, aber die anderen Funktionen benötigen doch auch Prozessor-Zeit,

    mfg (Auto)Bert

  • Hi,
    genau nur ein Ping sollte !!! nicht muß in der Zeit funktionieren.

    Hier die Erklärung wieso es länger dauert.

    Spoiler anzeigen
    Zitat

    Der Befehl nslookup kann unter Mac OS X, Windows und Unix verwendet werden, um IP-Adressen oder Domänen eines bestimmen Computers mittels DNS herauszufinden. Der Name des Befehls bedeutet „Name Server lookup“, was so viel heißt wie „den Namen des Servers nachschlagen“.

    Nur wieso machst du vorher eine Ping auf die Adresse??
    Nur ein TCPNameToIP würde doch reichen??
    Die Antwortzeit wenn ein Server nicht antwortet, könntest du mit den Zeitfunktionen ermitteln.

    MfG
    Der_Doc

  • Hi,
    hier gibt es eine Erklärung. Windows (bzw die implementierung des TCP) "berechnet" die Wartezeit auf einen nicht laufenden Serverprozess dynamisch. Das kann bis zu 15 Sekunden dauern und ist NICHT beeinflussbar!

    Zitat

    Die Antwortzeit wenn ein Server nicht antwortet, könntest du mit den Zeitfunktionen ermitteln.

    Genau DAS funktioniert nicht.....

    Spoiler anzeigen
    [autoit]

    Opt("TCPTimeout", 3000) ;1000 milliseconds egal welche zahl, bringt nix....

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

    TCPStartup()
    ;ip-adressen der ftp-server oder eines erreichbaren rechners, auskommentieren zum testen
    $szIPADDRESS = "193.99.144.85" ; Heise hat dort keine ftp-server laufen
    ;$szIPADDRESS = "85.214.130.125" ;autoit aber schon
    ;$szIPADDRESS = "127.0.0.1" ;intern, hier wird die adlib-funktion aufgerufen

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

    $pingzeit = Ping($szIPADDRESS, 500)
    If $pingzeit <> 0 Then ;wenn Rechner per ping erreichbar, dann
    MsgBox(0, "Ping erfolgreich", $pingzeit)
    Else
    MsgBox(0, "Ping fehlgeschlagen!", 0)
    EndIf

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

    $nport = 21 ;ftp
    $mainsocket = -1 ;keine Verbindung

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

    Global $t = TimerInit() ; timer startzeit merken
    AdlibEnable("_tcp_timeout", 1000) ;"normalerweise" würde nach einer Sekunde die Funktion aufgerufen werden, auch wenn der Rechner nicht erreichbar ist, funktion
    $mainsocket = TCPConnect($szIPADDRESS, $nport) ; wenn kein server auf port 21 erreichbar ist, dann Wartezeit ca 15-20 sec, obwohl der rechner online ist
    $error=@error
    AdlibDisable()

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

    $m = TimerDiff($t) ;wieviel zeit ist seit dem timerstart vergangen?
    If $mainsocket <> -1 Then ;wenn Verbindung zum FTP hergestellt, dann
    MsgBox(0, "mainsocket " & $m, "FTP-Server erreicht unter "&$mainsocket)
    Else
    MsgBox(0, $m, "FTP-Server nicht erreichbar"&@crlf&"Fehlernummer: "&$error)
    EndIf
    Exit

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

    Func _tcp_timeout() ;wird nur bei internen netzverbindungen aufgerufen....
    $m = Int(TimerDiff($t)) ;wieviel zeit ist seit dem timerstart vergangen?
    If $mainsocket = -1 Then
    MsgBox(0, "adlib "& $m, "FTP-Server nicht erreichbar" & @CRLF )
    Else
    Msgbox(0,0,"Diese Nachricht sollte man normalerweise nicht sehen!")
    endif
    AdlibDisable()
    EndFunc ;==>_tcp_timeout

    [/autoit]

    probiert das einfach mit den auskommentierten IP´-Adressen am Anfang des Scriptes aus. Die AdlibEnable() -Funktion wird ausschliesslich bei INTERNEN Rechnerverbindungen (alles was nicht über den Router nach "draussen" läuft) aufgerufen! Wenn ein Rechner im Internet per Ping erreichbar ist, aber dort kein z.B. FTP-Server läuft, dann werden die Anfragen nach dort auch nicht von der AdlibEnable()-Funktion unterbrochen!


  • Nur wieso machst du vorher eine Ping auf die Adresse??
    Nur ein TCPNameToIP würde doch reichen??
    Die Antwortzeit wenn ein Server nicht antwortet, könntest du mit den Zeitfunktionen ermitteln.

    MfG
    Der_Doc

    Damit er fals der PC nicht an ist, erst garnicht versucht die IP aufzulösen.

  • Hallo Jonathan,
    meine Frage war eigentlich retorisch.
    Bin Netzwerkadmin ;)

    Mit deiner Wartezeit weis ich aber trotzdem nicht wie du die verkürzen kannst.
    Ich habe mal ne Nsloockup-Funktion geschrieben, aber ob die schneller ist wie deine Lösung weis ich leider auch net.

    MfG
    Der_Doc