PING-Script: Abbrechen nach x-Sekunden

ahykes

Erfahrenes Mitglied
Hallo Jungs,

habe nun einen Befehl gefunden, der mir eine IP-Adresse anpingt:
PHP:
	$u = exec("ping -n 1 53.43.162.34");
                echo $u;
Ist das System hinter der IP erreichbar,bekomme ich in $u ganz schnell eine Antwort. Wenn das System nicht erreichbar ist, dauert es erheblich länger bis in $u etwas drinsteht - logisch. Das ganze läuft in einer Schleife. Nun meine Frage: Wie kriege ich das hin, dass er die Schleife abbricht, wenn der Ping nach 2ms nicht anwortet:rolleyes: Habt Ihr eine Idee?
 
Also 2ms ist wohl viel zu wenig, solche Pings kriegst Du vielleicht im LAN, aber nicht im Internet.
Du kannst dem Ping-Befehl einen TimeOut mitgeben, so sollte sich das recht elegant loesen lassen. Um direkt mit PHP zu pingen braucht man ja leider Root-Rechte.
 
Komische IPs hast Du im LAN. ;)

In dieses Script muesstest Du halt "nur noch" einbauen, dass auch die Antwort vom Rechner (falls sie denn kommt) ausgewertet wird. Und natuerlich localhost durch die zu pingende IP ersetzen.
PHP:
<?php
function calcchecksum($packet)
{
	if (strlen($packet)%2!=0)
		{
			$packet.="\x00";
		}
	$wordrow=unpack("n*",$packet);
	$checksum=array_sum($wordrow);
	while ($checksum>>16)
		{
			$checksum=($checksum>>16)+($checksum&0xffff);
		}
	$packedsum=pack("n",~$checksum);
	return $packedsum;
}

function incsequenceno($sequenceno)
{
	if (ord($sequenceno{1})==255)
		{
			return chr(ord($sequenceno{0})+1)."\x00";
		}
	else
		{
			return $sequenceno{0}.chr(ord($sequenceno{1})+1);
		}
}

$socket=socket_create(AF_INET,SOCK_RAW,1);
socket_connect($socket,"localhost",NULL);
$type="\x08";
$code="\x00";
$identifier="\x00\x00";
$sequenceno="\x00\x00";
for ($x=0;$x<4;$x++)
	{
		$data="";
		for ($y=0;$y<7;$y++)
			{
				$data.=chr(rand(0,255));
			}
		$data.="\x00\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37";
		$checksum="\x00\x00";
		$sequenceno=incsequenceno($sequenceno);
		$checksum=calcchecksum($type.$code.$checksum.$identifier.$sequenceno.$data);
		$packet=$type.$code.$checksum.$identifier.$sequenceno.$data;
		socket_write($socket,$packet);
	}
socket_close($socket);
?>
Ansonsten wuesste ich nicht was gegen einen TCP-Ping mittels fsockopen() spraeche. Ich nehme einfach mal an, dass der zu pingende Rechner Windows faehrt, dementsprechend sollte er auf Port 139 erreichbar sein.
 
Vielen Dank! Ja, die IP-sind aus unserem Firmen Adressraum welweit - proll ...

TCP-Ping kenn ich schon ... ;-) Aber es geht darum SPS-en und Roboter anzupingen. Die haben keine Verbindung über TCP...:(
 
Die Dinger laufen irgendwie über ein ganz anderes Protokol. Manchmal haben sie zwar sogar einen Webserver zur Konfiguration aber manchmal halt auch nicht. Ich möchte einfach alle gleich behandeln :-) Sind ja 300 Stück :-)
 
Naja, dann wirst Du wohl mit ICMP leben muessen.
UDP wuerde Dir nichts nuetzen, da Du da nichtmal eindeutig feststellen koenntest ob ein Port offen ist oder nicht. Und was anderes als TCP und UDP kann fsockopen() nicht, zumindest nicht, dass ich wuesste.
 
Zurück