Webseite auf Erreichbarkeit testen - aber ohne Ping

  • Hallo allerseits,

    ich möchte gerne testen, ob ein Accesspoint in meinem Netz noch da ist. Pingen lässt sich das gute Stück nicht, aber wenn ich die IP über den Browser aufrufe, bekomme ich Zugriff aufs Webinterface des AP. Mit InetRead geht das zwar, aber wenn der AP nicht an ist, brauchts ewig, bis die Anweisung abgearbeitet ist. Dasselbe beim Include: _InetGetSource etc brauchen auch ewig. Gibt's da denn noch eine andere Möglichkeit? Ich will ja nur wissen, ob das Dingens an ist - mehr nicht.

    Einmal editiert, zuletzt von Andre_ (23. Februar 2014 um 10:17)

  • Ich vergaß noch zu erwähnen, dass die zu überprüfende Seite sich mit einem htaccess-Fenster meldet. Da scheitern - zumindest bei mir - die meisten Versuche.
    Wenn jemand eine Lösung anzubieten hätte... ein paar Zeilen Code bzw. etwas mehr an Hinweis wäre nett. Danke schonmal.

  • Kannst du nicht beim Router anfragen, ob die IP-Adresse im Moment vergeben ist oder so? Da müsste sich doch was mit DHCP machen lassen.

    Widerstand ist Zwecklos!

    Meine Projekte: Kizzys Controller, 2nd Desktop und Versteckte Dateien Assistent
    Meine Downloadwebsite .

  • Ich möchte das Tool möglichst universell einsetzbar gestalten, d.h. möglichst wenig davon ausgehen müssen, ob nun die IPs über DHCP oder Manuell vergeben werden. Beispielsweise hab ich in dem einen Fall fest vergebene IPs für die Accesspoints (da sie eine Radiusserver-Konfiguration durchschleifen, die verteilt dann an die Clients über DHCP).

    InetRead liefert ja schon ein Ergebnis, aber mir fehlt da so ein netter Timeout-Flag, damit mein Programm nach mindestens 2 Sekunden weiterarbeiten kann. Sonst wird's supernervig, sollten mal 4-5 Accesspoints gerade mal off sein. Wie schon gesagt, die APs haben zu Beginn eine htaccess-Seite. Evtl. weiß da jemand, wie ich das einfach feststellen kann - nur feststellen, ich will mich da garnicht einloggen können müssen.

    Vielen Dank schonmal für die bisherigen Hiflen.

  • Sry, bin am Handy. Hat InetRead nicht eine Hintergrundoption? Dann
    InetRead (Hintergrund)
    Sleep(3000)

    Auswerten, weiterarbeiten.

    Wie gesagt, sry wegen Handy.

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Ich mach dies immer so, dass ich mit _IECreate versuche die Seite zu öffnen und dann prüfe ich in einer Schlaufe mit _IEDocReadHTML($oIE) ob ein Text erscheint.
    So kann ich die Zeit definieren, wie lange die Suche laufen soll.

    [autoit]


    FUNC TestSeite($url, $sText, $iMaxWaitTime)
    $oIE = _IECreate($url, 0, 1, 0)

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

    If IsObj($oIE) Then
    $TimeToWait = _DateAdd('s', $iMaxWaitTime, _NowCalc())
    $sHTMLText = _IEDocReadHTML($oIE)
    While _DateDiff('s', $TimeToWait, _NowCalc()) >= 0
    If StringInStr($sHTMLText, $sText) > 0 Then
    Return True
    EndIf
    Wend
    Return False
    EndIf
    EndFunc

    [/autoit]

    Dies ist nur ein Auszug. Je nachWebseite musst du natürlich alle Frames durchloopen.

    Gruss Roger

  • Hi Roger,
    sorry für die späte Antwort, aber irgendwie Funktioniert das bei htaccess-Fenstern auch nicht.
    AutoIt quittiert mir das mit einer Fehlermeldung, wenn das Objekt nicht ausgelesen werden kann:

    Code
    The requested action with this object has failed.:
    Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML)
    Return SetError($_IEStatus_Success, 0, $o_object.document^ ERROR

    Wenn ich die Fehlermeldung vermeiden könnte um zu wissen, ist da überhaupt ein htaccess-Fenster (was mir ja reichen würde) wäre das spitze.

    Danke schonmal für die Hilfe
    Gruß
    André

    Einmal editiert, zuletzt von Andre_ (22. Februar 2014 um 17:28)

  • Wie wäre es mit InetGetSize. Das dauert nicht solange wie InetGet oder InetRead da die Datei nicht vollständig heruntergeladen wird sondern nur die Größe abgefragt wird. Falls die Webseite nicht verfügbar ist wird @error gesetzt.

    Bsp.:

    [autoit]

    Local $size=InetGetSize($Website)
    If $size=0 Or @error Then ;... --> Seite ist nicht verfügbar.

    [/autoit]
  • Funktioniert leider beides nicht:
    Bei der Variante mit den TCP-Anweisungen bekomm ich interessanterweise immer die Messagebox, dass der Client online ist. Auch wenn ich IP-Adressen verwende, die definitiv nicht belegt sind.
    Bei dem InetGetSize bekomme ich immer für $size den Wert 0.
    Das liegt vermutlich am davorgeschalteten htaccess-Fenster, da kann auch keine Größe ausgelesen werden.
    Wie gesagt, ich will nur prüfen, ob die Seite ein htaccess-Fenster anbietet. Keine Abfragen, kein sonstiger Schnickschnack.

    • Offizieller Beitrag

    Natürlich musst du TCPNameToIp weglassen wenn du direkt ne IP eingibst ;)

    Es gibt auch die Option TCPTimeout, leider bringt die rein gar nichts beim Connect.. (ist ein schon alt bekannter bug...) Es gibt aber im englischen Forum eine TCPConnect funktion mit Timeout, einfach mal suchen und dann die TCPConnect funktion in dem Beispiel oben mit der ersetzten ;)

    Gruß,
    Spider

    Edit: hier mal ne schönere Implementierung:

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    $fCheck = _CheckOnline(TCPNameToIP("www.google.de"))
    MsgBox(0,"","Is online? :"&$fCheck)
    $fCheck = _CheckOnline(TCPNameToIP("www.irgendeinquatsch.de"))
    MsgBox(0,"","Is online? :"&$fCheck)
    $fCheck = _CheckOnline("173.194.39.23");google ip, hier natürlich ohne TcpNameToIp..
    MsgBox(0,"","Is online? :"&$fCheck)
    $fCheck = _CheckOnline("111.111.11.11");quatsch, braucht aber sehr lange -> im engl forum nach TCPConnect + Timeout suchen!
    MsgBox(0,"","Is online? :"&$fCheck)

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

    Func _CheckOnline($sIP)
    Local $hCon = TCPConnect($sIP, 80)
    Local $iErr = @error
    TCPCloseSocket($hCon)
    Return SetError($iErr,0,$hCon > 0)
    EndFunc

    [/autoit]
  • Hi Spider,
    klar hab ich TCPNameToIp weggelassen, aber daran liegt es wie gesagt nicht. Ich bekomme gar keinen TCP-Connect, wenn das htaccess-Fenster davor ist.
    Da sagt er mir - Timeout hin oder her - dass es diese Webseite garnicht gibt. über die TCP-Befehle geht's also gar nicht.
    Die englisch _TCPConnect hab ich gefunden, aber die geht natürlich auch nicht für das, was ich brauche.
    InetRead mit einem Timout bräuchte ich, das würde gehen. Gibt's aber nicht.

  • Hab eine Lösung gefunden:
    Über das Include WinHttp kann man mit _WinHttpSetTimeouts die gewünschte Timeoutzeit definieren. Defaultmäßig liegen die laut MSDN bei 30 Sekunden, was ja eine Ewigkeit ist.
    Die Timeouts lassen sich mit diesem Parameter schön einstellen:

    Code
    _WinHttpSetTimeouts($hInternet, $iResolveTimeout = Default, $iConnectTimeout = Default, $iSendTimeout = Default, $iReceiveTimeout = Default)

    Als Handle habe ich das von _WinHttpOpen() verwendet. Es muss logischerweise vor den eigentlichen Aktionen definiert sein, also vor _WinHttpSendRequest und _WinHttpReceiveResponse.

    Schön wäre es, wenn man in einer kommenden AutoIt-Version InetRead auch mit dem Parameter Timeout bestücken würde. Laut MSDN sollte das ja nicht so schwer sein.