|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.02.2013, 13:14 Titel: Server Status mit JavaScript |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.02.2013, 13:36 Titel: Ideen: jQuery clientseitig oder mit php-Skript serverseitig |
|
|
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 _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.02.2013, 14:34 Titel: |
|
|
Danke dir,
PHP kam mir auch schon in den Sinn, hatte aber anfänglich die Befürchtung es würde mir zu kompliziert werden
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.02.2013, 16:56 Titel: |
|
|
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 _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.02.2013, 19:32 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.02.2013, 19:51 Titel: IP-Adresse aus HTTP-Response-Header isolieren |
|
|
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 _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.02.2013, 20:04 Titel: |
|
|
Zitat: | User-Agent: Moped/1.0 |
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 _________________
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.02.2013, 20:16 Titel: |
|
|
Eternal_pain hat Folgendes geschrieben: | Zitat: | User-Agent: Moped/1.0 |
|
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 _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.02.2013, 00:43 Titel: |
|
|
Ich glaube ich mag PHP nicht
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 _________________
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 06.02.2013, 01:07 Titel: |
|
|
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.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.02.2013, 19:40 Titel: |
|
|
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
vielen dank _________________
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 06.02.2013, 19:56 Titel: |
|
|
Kein Problem!
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"> </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">'; |
_________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.02.2013, 20:32 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.02.2013, 21:15 Titel: |
|
|
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 |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.02.2013, 02:40 Titel: |
|
|
Mit diesem kleinen 'Experiment' jedenfalls hab ich gemerkt das PHP doch nicht ganz so einfach ist wie ich es mir vorgestellt habe
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 |
|
|
|
|
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.
|
|