Netzwerk: Statusanzeige auf Webseite

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.249
Hi

ich möchte etwas zuhause und rein für die PRIVATgebrauch basteln. Ich nutze zuhause WindowsXP und einen Apache Webserver (php, mysql natürlich auch). Zudem sammeln sich so langsam die Geräte mit IP-Adressen (ist ja echt gruselig was alles ne IP hat ... *G*).

Jetzt würde ich mir gerne ein kleines Webinterface basteln ... erstmal sollten alle Geräte angezeigt werden (muss nicht automatisch suchen) => ist ja kein Ding.

Danach sollte angezeigt werden, welche der Geräte aktuell eingeschaltet sind ... ja - das ist das Problem. Aktuell löse ich das über ein Script was einen ping ausführt (via ping.exe) ... das Ergebnis wird in kurzform ausgewertet - durchgegangener Ping = 1 => An, 0 = aus. Problem: bei der Anzahl Geräte dauert das ausführen des Scripts min. 20sek ... weil halt jede Komponente der reihe nach Angepingt wird ... doll.

Wie kann ich das den anders lösen? Wie gesagt: eigener Webserver und der ist so konfiguriert das php Scripte Windows-Befehle, Tools etc. starten kann (solang diese eine cmdline-Ausgabe haben; wie ping, tracert usw.)

Ich könnte den arp-Cache auslesen - würde aber voraussetzen das die Clients (Windows, iOS, Drucker, TV, Entertain, AP usw.) sich am Server regelmässig "melden" (ok DNS ist da drauf - aber meinen Drucker juckt das z.b. nicht - der hat mit dem Server nichts zu tun). Wäre also nicht so genau. SNMP wäre vielleicht auch eine möglichkeit ... wenns die Clients den Sprechen würden (weiß ich nur von meinem Drucker) ... aber sonst?

Gruß
Patrick
 
Ping kannste doch auch noch einstellen wegen Timeouts, Anzahl der Anfragen etc. Damit schonmal rumgespielt?

Alternativ: Haben die Geräte offene Ports? Falls ja kannste über fsockopen versuchen ne Verbindung aufzubauen - mit nem niedrig gesetzten Timeout geht das recht schnell durch.
 
Nutze statt ping einfach nmap, da gibt es einige Optionen mehr. Unter anderen kannst du damit den timeout auf wenige Milisekunden stellen, sodass das Script in wenigen Sekunden durchgelaufen sein sollte.
 
Hi

mhhhh also den Ping mach ich mit -n 1 (also 1 Ping) und -w 1 (kleinstmöglicher Zeit für Rückmeldung) ... 1 ms ... wenn ich das in der cmd-line mache bekomm ich bei ausgeschalteten Geräten auch quasi instant die Rückmeldung. Im Script liegen 9 Geräte (gerade mal die hälfte ...) und dafür brauch ich fast 5sek - mhhh da stimmt wohl eher etwas nicht.

Ich sollte wohl eher darüber nachdenken wo das script hackt ...

Ich habe die IP-Adresse in einem Array liegen.
Das Komplett fertige Verfügbarkeitsergebniss (mit bissel html-code) schreibe ich in eine Datei rein, welche so komplett von Haupt-Script included wird. Die Datei wird nur alle 241sek neu erstellt (weil das halt so lange dauert - doof wenn ich die "Intranet-Hauptseite" aufrufe und es dauert erstmal paar Sekunden - und das bei jedem Klick). Ist das Dateidatum also größer 241 wird das script komplett durchgejagt - ansonsten wird einfach nur das Ergebnis included.


PHP:
$ips = array('172.20.5.1', '...');

// Erfassung Aktuelle Zeit, Dateizeit, Dateiname, Differenz-Zeit
$AktuelleZeit = mktime();
$fileName = "h:/www/status.txt";
$Dateizeit = filemtime($fileName);
$ZeitDifferenz = $AktuelleZeit - $Dateizeit;

if ($ZeitDifferenz > 241 ) {    // Datei älter als X Sekunden, dann neue erstellen
for ($i=0; $i<count($ips); $i++) {
   exec("ping.exe -n 1 -w 1 $ips[$i]", $gepingt);
   $check = preg_split('/ /', $gepingt[6], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
   
    if ($check[9] == "0")  // Abfrage "Verloren = 0" => erreichbar!
	{ 
		$ausgabe .= "<font color='green'>" . $pcs[$i] . "</font></br>";
		$gepingt = ""; // variable zurücksetzen
	} else 
		{ 
			$ausgabe .= "<font color='red'>" . $pcs[$i] . "</font></br>";
			$gepingt = "";
		}   
}

// neue Datei wird erstellt
$input = fopen ($fileName, 'w');
fputs($input, $ausgabe);
fclose($input);
echo $ausgabe;
} else {

// vorhande Datei wird ausgelesen
$output = fopen ($fileName, 'r');
$ausgabe = fgets ($output, 1000);
fclose($output);
echo $ausgabe;


Also irgendwo hängt das ganze script und frisst zeit. 1sek maximal wenn Datei älter 241sek ... aber gleich 4-5sek ...? Ist die Datei jünger 241sek hab ich normale Aufbauzeit für die Seite 0.02sek.

@Masamune2: in den ms-Bereich komm ich ja mit ping auch. Auf der cmd-line wie gesagt instant - genau so bräuchte ich es im script - aber das will irgendwo nicht

@tou: offene Ports bei den Windows-Kisten klar ... auch der Router, AP, Drucker haben offene Ports (http). Beim iphone, tv, playstation, wii, usw. k.a. ;) und beim Dienstlaptop (Firewall) vermutlich nö.
 
Du könntest mal nen Sniffer wie Wireshark mitlaufen lassen - dann siehste evtl. wo die Zeit verloren geht.
 
mhh ob das ein Problem im Netz ist glaub ich eher nicht.
ping -n 1 -w 1 ist ja quasi instant-Antwort. Das klappt normal von der Cmd-Line

Da scheint eher am script zu liegen - vielleicht gibts bei exec irgendwelche verzögerungen ...
 
hi nochmal ;)

hab mal ein wenig drüber gegrübelt ... bei 10 IPs die ich prüfen möchte, muss ich 10x via exec die ping.exe aufrufen ... ich denke genau da liegt auch die verzögerung. Gibts ne möglichkeit die ping.exe schneller aufzurufen?

EDIT:

Hi

ich hab den vorschlag von oben noch mal aufgegriffen und es mit fsockopen probiert. Einzelner aufruf klappt ohne probleme ... ratzfatz. Nur im Array schlägt die prüfung immer fehl. Irgendwas stimmt da nicht ;(

das array ist nur verkürzt dargestellt ... das schema zieht sich so für alle positionen durch ... gleiches system wie beim ping-script ... also das array ist eigentlich in ordnung.

PHP:
<?
$pcs = array('webserver', ....);
$ips = array('172.20.5.30', ...);
$ports = array('80', ...);

for ($i=0; $i<count($ips); $i++) {
$fp = fsockopen($ips[$i], $ports[$i], $errno, $errstr, 0);
	if (!$fp) {
		echo $ips[$i] . " / ". $pcs[$i].": nicht erreichbar <br />";
	} else {
		echo $ips[$i] . " / ". $pcs[$i].": erreichbar <br />";
		fclose($fp);
		}
	}
?>
hier bekomme ich bei JEDEM Eintrag ein "nicht erreichbar"

Wenn ich direkt danach einen direkten test mache, kommt erreichbar (was auch richtig ist)

PHP:
<?
$ip = "172.20.5.30";
$port = "80";
$fp = fsockopen($ip, $port, $errno, $errstr, 1);
	if (!$fp) {
		echo "nicht erreichbar";
	} else {
echo "erreichbar";
    	fclose($fp);
}
?>

bin ich hier blind? das ist doch oben wie unten der gleiche code - nur das ich oben mit einem array arbeite und unten mit einer normalen Variable ;/

Wo ist der Fehler?

Gruß
 
Zuletzt bearbeitet:
Hi und sorry für die späte Antwort.
Das Problem ist der Timeout von 0 hier:

Code:
$fp = fsockopen($ips[$i], $ports[$i], $errno, $errstr, [COLOR="Red"][B]0[/B][/COLOR]);
Wulfman_SG schrieb:
bin ich hier blind? das ist doch oben wie unten der gleiche code - nur das ich oben mit einem array arbeite und unten mit einer normalen Variable ;/

Wo ist der Fehler?

Gruß

Und nein ist nicht der gleiche Code. Du benutzt im unteren Codeschnipsel nämlich einen Timeout von 1, deswegen funktionert der.
Setz den Timeout einfach mal rauf, dann klappts auch mit dem Array ;)

Gruß Tou
 
Zurück
Oben