Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Server Status mit JavaScript

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.02.2013, 12:14    Titel: Server Status mit JavaScript Antworten mit Zitat

Hallo zusammen,

ich wollte auf meiner Seite (eternalpain.tgp-gaming.de) ein link+serverstatus anzeigen lassen, das ganze funkioniert im prinzip auch richtig.
Einzige das mich stört, wenn der server offline ist, dauert es recht lange bis er das 'erkennt' kann man hier die Abfrage irgendwie mit einem Timer versehen ála wenn nach N sekunden kein erfolg dann ist er offline? zZ sind es gefühlte 5minuten...

meine test.html, die auf meinen festen webspace liegt
Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <script type="text/javascript">
         function check(url) {

            if(!url || !document.images) return

            var img = new Image();

            img.onload = function () {

               alert('Das Bild konnte geladen werden der Server ist online!');

               document.images[testBild].src = this.src;

            };

            img.onerror = function () {

               alert('Das Bild konnte nicht geladen werden!');

               document.images[testbild].src = this.src + '?' + Math.random();

            }

            img.src = url;

         }
      </script>
      
      <title></title>
   </head>
   <body>
      <h1>It works!</h1>
      <img src="http://eternalpain.no-ip.org/online.png" onerror="if(!this.check) {this.check = true; this.src = 'offline.png';}" alt ="status">
   </body>
</html>


zu sehen sollte sein das wenn der check erfolgreich war lädt er die online.png und zeigt diese an, wenn nicht dann lädt er die offline.png auf meinem webspace.

Wie gesagt funktioniert es ganz gut, nur eben die Zeit wenn der Server offline ist, dauert zu lange...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.02.2013, 12:36    Titel: Ideen: jQuery clientseitig oder mit php-Skript serverseitig Antworten mit Zitat

Hi EP,

in der jetzigen Konstruktion nutzt du ja das "Aufgeben" des Browsers beim Bildladen (onError), um festzustellen, dass der src-Server nicht online ist. Ich könnte mir vorstellen, dass man das skriptseitig nicht beeinflussen kann, welchen Timeout der Browser für seine normalen Requests benutzt.

Meine Lösungsideen wären:

  • Clientseitig: jQuery benutzen und versuchen, die Statusanzeige per AJAX nachzuladen. Dabei kann ein Timeout vom Skript bestimmt werden. Schlägt das Nachladen im gesetzten Zeitraum fehl, blendest du via Skript das Offline-Bild ein.
  • Serverseitig: Ein php-Skript auf deinem Webspace wird als Bild eingebunden. Intern versucht das php-Skript, mit einem selbst zusammengebauten oder von einer entsprechenden Fertigfunktion abgesetzen HTTP-Request, deinen Server zu kontaktieren. Dafür kann ein Timeout angegeben werden. Gelingt der Connect im php-Skript, liefert es Bild A zurück, sonst Bild B (siehe auch fpassthru).


Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.02.2013, 13:34    Titel: Antworten mit Zitat

Danke dir,

PHP kam mir auch schon in den Sinn, hatte aber anfänglich die Befürchtung es würde mir zu kompliziert werden happy

Ich hab nun was gefunden mit dem ich etwas 'rumspielen' konnte, leider tut es nicht ganz das was es soll und weiss natürlich leider nicht genau woran es denn liegt. Denn mir wird immer die offline-grafik zurückgegeben.

Ich vermute das es irgendwie mit dem redirekting von no-ip liegen könnte und ich da noch irgendeine curl_option dafür setzen muss, leider weiss ich nicht genau welche... (oder ob es doch an etwas andere liegt...)

Code:

<?php
   header('Content-Type:image/png');

   function Visit($url) {

      $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
      
      $ch=curl_init();

      curl_setopt ($ch, CURLOPT_URL,$url );

      curl_setopt($ch, CURLOPT_USERAGENT, $agent);

      //curl_setopt ($ch, CURLOPT_AUTOREFERER, true);
      
      //curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
      
      //curl_setopt ($ch, CURLOPT_MAXREDIRS, 2);      
      
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

      curl_setopt ($ch,CURLOPT_VERBOSE, false);

      curl_setopt($ch, CURLOPT_TIMEOUT, 10);

      $page=curl_exec($ch);

      $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

      curl_close($ch);

      
      if($httpcode>=200 && $httpcode<300) {
         return true;
      }
      else {
         return false;
      }

   }

   


   if(Visit("http://eternalpain.no-ip.org/")) {

       //Server On
      readfile('online.png');

   }
   else {

      //Server Off
      readfile('offline.png');
   }



?>

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.02.2013, 15:56    Titel: Antworten mit Zitat

Hi Eternal_Pain,

das Problem ist wahrscheinlich die Art, wie du deine Hostname-Weiterleitung eingerichtet hast. In deinem Fall verweist die Domain "eternalpain.no-ip.org" nicht etwa auf die IP-Adresse deines Routers zu Hause, sondern auf die eines Servers von No-IP. Der antwortet auf HTTP-Anfragen auf Port 80 mit einer Weiterleitung via "HTTP 302 Moved Temporarily" zu deiner IP und einem alternativen HTTP-Port (8080). Das heißt, du hast es immer mit diesem "Mittelsmann" zu tun statt direkt mit deinem System.

Code:
sebastian@hpdc7800p:~$ curl --head http://eternalpain.no-ip.org/
HTTP/1.1 302 Found
Date: Tue, 05 Feb 2013 14:45:08 GMT
Server: Apache
Location: http://78.42.26.3:8080
Connection: close
Content-Type: text/html; charset=UTF-8

sebastian@hpdc7800p:~$ nslookup eternalpain.no-ip.org
Server:      127.0.0.1
Address:   127.0.0.1#53

Non-authoritative answer:
Name:   eternalpain.no-ip.org
Address: 8.23.224.90


Als Lösung würde ich vorschlagen, diese Weiterleitung abzuschalten und stattdessen den DNS-A-Eintrag der Subdomain direkt auf deine dynamische IP-Adresse zu legen. Diese HTTP-Weiterleitung ist eher ungünstig.
Die Änderung hätte allerdings den Nachteil, dass du deinen Server auch mit der Portangabe :8080 aufrufen müsstest. Es sei denn, dein Router kann intern (z. B. mit iptables) eine entsprechende Portweiterleitung von 80 nach 8080 vornehmen.

Wenn du es bei der Weiterleitung, so wie sie jetzt ist, belassen möchtest,

  • könntest du probieren, curl anzuweisen, dem Redirect zu folgen, oder
  • du müsstest du den HTTP-Response-Header vom No-IP-Server auswerten und genau die IP-Adresse hinter "Location:" isolieren. Die wiederum könntest du dann anpingen oder eine Socketverbindung herstellen. (Online-Detection letztlich in 2 Schritten.)


Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.02.2013, 18:32    Titel: Antworten mit Zitat

Hab mich (mehr oder weniger) entschieden den HTTP response der no-ip seite zu lesen/parsen und entprechen zu prüfen. Scheint mir nach anderen Versuchen doch das beste zu sein.
Aber PHP bringt mich ein wenig zum verzweifeln.
Einerseits gibt Befehle die einem wohl den Header direkt 'holen' welche ich aber nicht verstehe (sind das listen, arrays, oder was?)

Hab es dann per socket versucht, aber bei diesem Versuch lädt er endlos und verstehe einfach nicht warum?!

Code:

<?php
   function getheader() {
      $fp = fsockopen('eternalpain.no-ip.org', 80, $errno, $errstr, 30);
   
      if ($fp) {
         
         $out = 'GET / HTTP/1.1\r\n';
         $out .= 'Host: eternalpain.no-ip.org\r\n';
         $out .= 'Connection: Close\r\n\r\n';
         fwrite($fp, $out);
         
         while (!feof($fp)) {
            $bfp = fgets($fp, 128);
            $header .= $bfp;
         }
         fclose($fp);
      }
      return $header;
   }
   
   $header = getheader();
   echo $header;
?>

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.02.2013, 18:51    Titel: IP-Adresse aus HTTP-Response-Header isolieren Antworten mit Zitat

Hi,

was hältst du hiervon:

Code:
<?php

   function getheader() {
      $header = "";
      $timeout = 10;
      $host = "eternalpain.no-ip.org";
      $fp = fsockopen($host, 80);
      stream_set_timeout($fp, $timeout);
      if ($fp) {
         $out  = "GET / HTTP/1.1\r\n";
         $out .= "Host: ".$host.":80\r\n";
         $out .= "User-Agent: Moped/1.0 (EPs Online Status Checker)\r\n";
         $out .= "Connection: close\r\n\r\n";
         fwrite($fp, $out);
         while ($tmp = fread($fp, 512)) {
            $header .= $tmp;
         }
         fclose($fp);
      }
      return $header;
   }


   $header = getheader();
   
   
   header("Content-Type: text/plain");
   echo $header;
   
   $result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $header, $matches);
   if ($result == 1) {
      echo "\r\nDie IP-Adresse von EP ist: \"" . $matches[0] . "\"\r\n";
   } else {
      echo "\r\nIP-Adresse wurde nicht erfolgreich im Response-Header gefunden.\r\n";
   }
   
?>


Durch den eigenen User-Agent könntest du die Online-Status-Checker-Anfragen leichter aus deinen Apache-Logs rausfiltern. Zum Beispiel der Webalizer bietet die Möglichkeit, bestimmte User-Agents bei der Auswertung auszuklammern.

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.02.2013, 19:04    Titel: Antworten mit Zitat

Zitat:
User-Agent: Moped/1.0
lachen

Das funktioniert besser als erwartet

unklar ist mir der Teil
Code:
header("Content-Type: text/plain");


und das hier versteh ich auch nur halb:
Code:
$result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $header, $matches);


Hatte vor das ganze (offensichtlich wesentlich umständlicher) mit strpos und substr zu machen...

vielen dank für Deine Hilfe lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.02.2013, 19:16    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
Zitat:
User-Agent: Moped/1.0
lachen

Wenn du den Code erweitert hast um den Teil, der zu deiner IP-Adresse connectet, würde ich mit 2 unterschiedlichen Agents arbeiten, je nachdem, an wen du dich richtest:
An No-IP würde ich irgendwas Unverfängliches senden (FF oder so, damit die nicht "WTF?!" denken) und an deine IP-Adresse einen eigenen ausgedachten User-Agent, den nur du kennst. So kannst du relativ zuverlässig die Statusabfragen aus den Logs aussortieren.

Eternal_pain hat Folgendes geschrieben:
unklar ist mir der Teil
Code:
header("Content-Type: text/plain");

Da du ja später aus dem php-Skript heraus Bilder senden möchtest statt Text, müsstest du das ersetzen durch den passenden MIME-Type, z. B. image/png. Das Demoskript, das ich gepostet hatte, gibt ja nur Text aus, deshalb "text/plain". Dann stellen die meisten Browser die Antwort nämlich in Monospace-Schriftart dar und versuchen nicht, irgendwas als HTML zu interpretieren.

Eternal_pain hat Folgendes geschrieben:
und das hier versteh ich auch nur halb:
Code:
$result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $header, $matches);


Hatte vor das ganze (offensichtlich wesentlich umständlicher) mit strpos und substr zu machen...

Der String in Anführungszeichen ist ein regulärer Ausdruck, der nach etwas sucht, das so ähnlich wie eine IP-Adresse aussieht. Übersetzt hieße der Ausdruck

Code:
3x Folgendes:
      1x Folgendes: EineZahlVon1Bis9   // muss mit Zahl > 0 anfangen, also keine führende Null
    0-2x Folgendes: EineZahlVon0Bis9
    Punkt

1x Folgendes:
      1x Folgendes: EineZahlVon1Bis9
    0-2x Folgendes: EineZahlVon0Bis9


Der Ausdruck trifft somit auch auf Zeichenketten zu, die keine gültigen IP-Adressen sind. Zum Beispiel "333.333.333.333" würde akzeptiert, nicht aber "019.019.019.019", weil führende Nullen ausgeschlossen sind.

Wenn man aber annimmt, dass in der Antwort von No-IP keine anderen Muster vorkommen, die so aussehen wie eine IP-Adresse, ist es evtl. nicht nötig, die Oktett-Gültigkeit genauer zu prüfen.

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.02.2013, 23:43    Titel: Antworten mit Zitat

Ich glaube ich mag PHP nicht happy

ich hab es jetzt zwar soweit das es funktioniert, aber leider mit dem selben Ergebnis wie ganz am Anfang schon mit javascript.
Er lädt einfach zu lange bis er einen TimeOut bekommt, obwohl ich diese schon runter gesetzt habe.

http://eternalpain.tgp-gaming.de/check2.php
Code:

<?php
   header('Content-Type:image/png');

   function domainAvailable($strDomain) {
   
      $rCurlHandle = curl_init ( $strDomain );

      curl_setopt ( $rCurlHandle, CURLOPT_CONNECTTIMEOUT, 5 );
      curl_setopt ( $rCurlHandle, CURLOPT_HEADER, TRUE );
      curl_setopt ( $rCurlHandle, CURLOPT_NOBODY, TRUE );
      curl_setopt ( $rCurlHandle, CURLOPT_RETURNTRANSFER, TRUE );

      $strResponse = curl_exec ( $rCurlHandle );

      curl_close ( $rCurlHandle );

      if ( !$strResponse ) {
         return FALSE;
      } else {
         return TRUE;
      }
   }
   
   function getheader($host = 'www.google.de', $agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', $port = 80) {
     
      $data = "";
      $timeout = 5;
      //$host = "eternalpain.no-ip.org";
      if (domainAvailable($host)) {
         $fp = fsockopen($host, $port);
         stream_set_timeout($fp, $timeout);
         
         if ($fp) {
            $out  = "GET / HTTP/1.1\r\n";
            $out .= "Host: ".$host.":80\r\n";
            $out .= "User-Agent: ".$agent."\r\n";
            $out .= "Connection: close\r\n\r\n";
            fwrite($fp, $out);
         
            while ($tmp = fread($fp, 512)) {
               $data .= $tmp;
            }
         
            fclose($fp);
         }
      
         list($header, $html) = explode("\r\n\r\n", $data);
      
         return $header;
      }
   }
   
   $viewimage = "offline.png";
   
   $header = getheader("eternalpain.no-ip.org");
   $result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $header, $matches);
   
   if ($result == 1) {
      $homeserver = getheader($matches[0].":8080","WSC/1.0 (Online Status Checker)",80);
      
      If ($homeserver) {
         //echo "Server On!";
         $viewimage = "online.png";
      } else {
         //echo "Server Off?";
      }
         
   //      
   } else {
      //echo "fehler";
   }   
   
   readfile($viewimage);
?>


Sieht nicht 'hübsch' aus, wird aber hoffentlich noch lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 06.02.2013, 00:07    Titel: Antworten mit Zitat

Hi EP,

so könnte es klappen:
Code:
<?php

   function getResponse ($host, $port, $timeout, $agent) {
      $response = "";
      $fp = fsockopen($host, $port, $errNo, $errStr, $timeout);
      stream_set_timeout($fp, $timeout);
      if ($fp) {
         $out  = "GET / HTTP/1.1\r\n";
         $out .= "Host: ".$host.":".$port."\r\n";
         $out .= "User-Agent: ".$agent."\r\n";
         $out .= "Connection: close\r\n\r\n";
         fwrite($fp, $out);
         while ($tmp = fread($fp, 512)) {
            $response .= $tmp;
         }
         fclose($fp);
      }
      return $response;
   }

   
   // Textdatei senden:
   header("Content-Type: text/plain");
   // Cachen verbieten:   (siehe: http://de2.php.net/manual/de/function.header.php )
   header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
   header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit

   echo "Timestamp ganz zu Beginn: ".time()."\r\n";
   
   $responseNoIP = getResponse("eternalpain.no-ip.org", 80, 10, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0");
   
      
   $result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $responseNoIP, $matches);
   if ($result == 1) {
      // OK, ich habe die IP-Adresse in $matches[0]
      $homeserverIP = $matches[0];
      $homeserverPort = 8080;
      $responseHomeServer = getResponse($homeserverIP, $homeserverPort, 5, "Moped/1.0");
      if (strlen($responseHomeServer) < 10) {  // Kein vollstaendiger Header empfangen. Vermutlich Timeout.
         // Fehler. Offline.
         echo "Keine Antwort vom Homeserver bei Timestamp " . time() . "\r\n";
         echo "Fehler: Homeserver nicht erreichbar!\r\n";
      } else {
         echo "Antwort vom Homeserver bei Timestamp " . time() . "\r\n";
         echo "Erfolg! Homeserver erreichbar!";
      }
   } else {
      // Konnte die IP-Adresse nicht aus der Antwort von NoIP isolieren.
      echo "Antwort von NoIP wurde bei Timestamp " . time() . " gelesen, kann aber nicht ausgewertet werden.\r\n";
      echo "Fehler: Homeserver anscheinend nicht erreichbar!\r\n";
   }
   
?>


Durch die angezeigten Timestamps sollte man nachverfolgen können, wie lange er sich tatsächlich Zeit lässt.

Das mit dem Bild müsstest du noch nachrüsten. Und du solltest vielleicht, wie du das in deinem ersten JavaScript-Code schon hattest, bei der Bild-URL immer einen Random-Query-String anhängen, um noch sicherer zu gehen, dass der Browser das Bild nicht nur aus dem Cache holt. lächeln

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.02.2013, 18:40    Titel: Antworten mit Zitat

Danke Sebastian, allein hätte ich das wohl so nicht hinbekommen.

Die domainAvailable Funktion die ich oben verwendet habe sollte verhindern mir die Debug Warnings auszugeben, wenn eine Seite nicht erreichbar ist... nach etwas googlen ging es auch viel einfacher indem ich diese beiden Zeilen:

Code:

      $fp = fsockopen($host, $port, $errNo, $errStr, $timeout);
      stream_set_timeout($fp, $timeout);


einfach nach
Code:

      $fp = @fsockopen($host, $port, $errNo, $errStr, $timeout);
      @stream_set_timeout($fp, $timeout);

geändert habe.

Zitat:
Das mit dem Bild müsstest du noch nachrüsten. Und du solltest vielleicht, wie du das in deinem ersten JavaScript-Code schon hattest, bei der Bild-URL immer einen Random-Query-String anhängen, um noch sicherer zu gehen, dass der Browser das Bild nicht nur aus dem Cache holt.


Bin mir nicht ganz sicher ob das so korrekt ist:
Code:
<img src="check.php" onload="this.src + '?' + Math.random();">


Ansonsten funktionierts jetzt wie gewünscht, perfekt lächeln

vielen dank
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 06.02.2013, 18:56    Titel: Antworten mit Zitat

Kein Problem! zwinkern
Eternal_pain hat Folgendes geschrieben:
Code:

      $fp = @fsockopen($host, $port, $errNo, $errStr, $timeout);
      @stream_set_timeout($fp, $timeout);

Ja, genau, mit dem @ unterdrückst du die etwaigen Fehlerausgaben.

Eternal_pain hat Folgendes geschrieben:
Code:
<img src="check.php" onload="this.src + '?' + Math.random();">

So ist es eigentlich nicht sinnvoll, weil du das Bild bei onload oder onerror ja nicht noch einmal geladen haben möchtest. Wenn, dann müsste man direkt im src-Wert etwas random-mäßiges im Query-String angeben.

Am einfachsten ginge das, wenn du die Seite mit php dynamisch erzeugst. Dann kannst du direkt in die Bild-URL irgendwelche zufälligen Zeichen ausgeben lassen.
Code:
... <img src="check.php?<?php echo($meineZufallszahl); ?>" alt="Online-Statusanzeige"> ...


Wenn du es clientseitig ohne serverseitig erzeugte Zufallszahl machen möchtest, würd ich vllt. etwas in dieser Richtung machen:
Code:
<div style="width:64px; height:64px;" id="grafikplatzhalter">&nbsp;</div>

und dann im JavaScript als onload-Handler für body ungefähr sowas:
Code:
var platzhalter = document.getElementById('grafikplatzhalter');
platzhalter.innerHTML = '<img src="check.php?' + Math.random() + '" alt="Online-Statusanzeige des Homeservers">';

_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.02.2013, 19:32    Titel: Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
Eternal_pain hat Folgendes geschrieben:
und das hier versteh ich auch nur halb:
Code:
$result = preg_match("/([1-9]{1}[0-9]{0,2}\\.){3}([1-9]{1}[0-9]{0,2})/", $header, $matches);


Hatte vor das ganze (offensichtlich wesentlich umständlicher) mit strpos und substr zu machen...

Der String in Anführungszeichen ist ein regulärer Ausdruck, der nach etwas sucht, das so ähnlich wie eine IP-Adresse aussieht. Übersetzt hieße der Ausdruck

Code:
3x Folgendes:
      1x Folgendes: EineZahlVon1Bis9   // muss mit Zahl > 0 anfangen, also keine führende Null
    0-2x Folgendes: EineZahlVon0Bis9
    Punkt

1x Folgendes:
      1x Folgendes: EineZahlVon1Bis9
    0-2x Folgendes: EineZahlVon0Bis9


Der Ausdruck trifft somit auch auf Zeichenketten zu, die keine gültigen IP-Adressen sind. Zum Beispiel "333.333.333.333" würde akzeptiert, nicht aber "019.019.019.019", weil führende Nullen ausgeschlossen sind

Ein hübsches Problem hat dieser Ausdruck aber: Vielleicht kommt einmal die IP-Adresse 2001:db8:1984:cafe::3fe daher. Schon heute besitzt mein www.dreael.ch bereits 2001:67c:8:e000:202:b3ff:fe62:fda6 nebst seinem IPv4-Pendant 46.14.162.199 ...

=> von dem her bitte in dieser ganzes Diskussion immer klar von IPv4 sprechen!

Übrigens für IPv6 wäre dieser Ausdruck etwas anspruchsvoller wegen der Verkürzungsregel bei längeren ":0:0:0:"-Gruppen, d.h.
Code:
$result = preg_match("/([1-9a-fA-F]{1}[0-9a-fA-F]{0,3}\\:){7}([1-9a-fA-F]{1}[0-9a-fA-F]{0,3})/", $header, $matches);

würde daher noch nicht ganz stimmen, weil er zwar 2001:db8:1984:cafe:0:0:0:3fe bereits akzeptiert, nicht aber 2001:db8:1984:cafe::3fe ...
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 06.02.2013, 20:03    Titel: Antworten mit Zitat

Danke für die Ergänzung! Das stimmt natürlich; die Angaben bisher im Thread beziehen sich auf IPv4-IP-Adressen. Sobald Eternal_Pains Internetanschluss auf IPv6 umgestellt wird, muss er also noch mal eine kleine Veränderung vornehmen. zwinkern Bspw. meiner ist noch IPv4-only.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.02.2013, 20:15    Titel: Antworten mit Zitat

Gerade kürzlich ein interessanter Artikel gelesen: T-Online verteilt aktuell schon heute bei den Neukunden IPv6-Adressen und es gibt bereits Pläne, IPv4 in Zukunft nur noch auf Verlangen zu verteilen. Ist aus meiner Sicht logisch: Weltweit sind sämtliche IPv4-Adressen inzwischen verteilt, als ISP bekommt man bei RIPE nur noch ein müdes Lächeln, wenn man nach zusätzlichen IPv4-Adressblöcken fragt.

=> Von dem her kann die Umstellung ohne Weiteres schon recht bald einmal notwendig werden für Eternal_pain ...
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.02.2013, 01:40    Titel: Antworten mit Zitat

Mit diesem kleinen 'Experiment' jedenfalls hab ich gemerkt das PHP doch nicht ganz so einfach ist wie ich es mir vorgestellt habe happy

zum Thema ipv6 hab ich gerade noch das gefunden:
https://mebsd.com/coding-snipits/php-regex-ipv6-with-preg_match.html
Code:
function valid_ipv6_address( $ipv6 )
{
        $pattern1 = '([A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}';
        $pattern2 = '[A-Fa-f0-9]{1,4}::([A-Fa-f0-9]{1,4}:){0,5}[A-Fa-f0-9]{1,4}';
        $pattern3 = '([A-Fa-f0-9]{1,4}:){2}:([A-Fa-f0-9]{1,4}:){0,4}[A-Fa-f0-9]{1,4}';
        $pattern4 = '([A-Fa-f0-9]{1,4}:){3}:([A-Fa-f0-9]{1,4}:){0,3}[A-Fa-f0-9]{1,4}';
        $pattern5 = '([A-Fa-f0-9]{1,4}:){4}:([A-Fa-f0-9]{1,4}:){0,2}[A-Fa-f0-9]{1,4}';
        $pattern6 = '([A-Fa-f0-9]{1,4}:){5}:([A-Fa-f0-9]{1,4}:){0,1}[A-Fa-f0-9]{1,4}';
        $pattern7 = '([A-Fa-f0-9]{1,4}:){6}:[A-Fa-f0-9]{1,4}';

        $full = "/^($pattern1)$|^($pattern2)$|^($pattern3)$|^($pattern4)$|^($pattern5)$|^($pattern6)$|^($pattern7)$/";

        if(!preg_match($full, $ipv6))
        return (0); // is not a valid IPv6 Address

    return (1);
}

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz