User Tools

Site Tools


server_auf_verfuegbarkeit_pruefen

Pingt alle angegebenen Adressen und liefert ein lesbares Ergebnis aus.
Die IP-Range und die Host-IP muss vorher im ping_check.php angepasst werden.

sudo php ping_check.php » php_ergebnis.txt

ping_check.php

<?php

require_once('netping.php');

$startIP = '192.168.1.1';
$endIP   = '192.168.5.255';

$aIPList = array();
if ((ip2long($startIP) !== -1) && (ip2long($endIP) !== -1)) { // As of PHP5, -1 => False
	for ($currentIPlong = ip2long($startIP) ; $currentIPlong <= ip2long($endIP) ; $currentIPlong++) {
		$myPing = new NetPing();
		$result = $myPing->checkHost($currentIPlong, '192.168.1.10', 1);
		
		$currentIP = long2ip($currentIPlong);
		$hostname  = gethostbyaddr($currentIP);
		printf("Host %s (%s) is: %s %s\n",
			$currentIP,
			$hostname,
			str_pad('', 40-strlen($hostname)),
			$result
		);
	}
}

netping.php

<?php

class NetPing {
	var $icmp_socket;
	var $request;
	var $request_len;
	var $reply;
	var $errstr;
	var $time;
	var $timer_startTime;

	public function __construct() {
		$this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1);
		socket_set_block($this->icmp_socket);
	}

	private function getIPChecksum($data) {
		$sum = 0;
		for ($i = 0; $i < strlen($data); $i += 2) {
			if ($data[$i + 1]) {
				$bits = unpack('n*', $data[$i] . $data[$i + 1]);
			}
			else {
				$bits = unpack('C*', $data[$i]);
			}
			$sum += $bits[1];
		}

		while ($sum >> 16) {
			$sum = ($sum & 0xffff) + ($sum >> 16);
		}

		$checksum = pack('n1', ~$sum);
		return $checksum;
	}

	private function startTime() {
		$this->timer_startTime = microtime();
	}

	private function getTime($acc=2) {
		// format start time
		$startTime = explode(" ", $this->timer_startTime);
		$startTime = $startTime[1] + $startTime[0];
		// get and format end time
		$end_time = explode(" ", microtime());
		$end_time = $end_time[1] + $end_time[0];
		return number_format($end_time - $startTime, $acc);
	}

	private function buildPacket() {
		$data = "abcdefghijklmnopqrstuvwabcdefghi"; // the actual test data
		$type = "\x08"; // 8 echo message; 0 echo reply message
		$code = "\x00"; // always 0 for this program
		$chksm = "\x00\x00"; // generate checksum for icmp request
		$id = "\x00\x00"; // we will have to work with this later
		$sqn = "\x00\x00"; // we will have to work with this later
		// now we need to change the checksum to the real checksum
		$chksm = $this->getIPChecksum($type . $code . $chksm . $id . $sqn . $data);
		// now lets build the actual icmp packet
		$this->request = $type . $code . $chksm . $id . $sqn . $data;
		$this->request_len = strlen($this->request);
	}

	public function checkHost($dst_addr, $src_addr = "", $timeout = 5, $precision = 3) {
		if ($this->ping($dst_addr, $src_addr, $timeout, $precision) !== FALSE) {
			return "UP";
		}
		
		return "DOWN";
	}

	public function ping($dst_addr, $src_addr="", $timeout=5, $precision=3) {
		// lets catch dumb people
		if ($src_addr <> "") { //if there is no source, then ping via default interface
			if (!socket_bind($this->icmp_socket, $src_addr, 0)) {
				$errorcode = socket_last_error();
				$errormsg = socket_strerror($errorcode);
				die("Couldn't bind socket: [$errorcode] $errormsg\n");
			}
		}

		if ((int) $timeout <= 0) {
			$timeout = 5;
		}

		if ((int) $precision <= 0) {
			$precision = 3;
		}

		// set the timeout
		socket_set_option($this->icmp_socket,
				SOL_SOCKET, // socket level
				SO_RCVTIMEO, // timeout option
				array(
					"sec" => $timeout, // Timeout in seconds
					"usec" => 0 // I assume timeout in microseconds
				)
		);

		if ($dst_addr) {
			if (socket_connect($this->icmp_socket, $dst_addr, NULL)) {

			}
			else {
				$this->errstr = "Cannot connect to $dst_addr\n";
				return FALSE;
			}

			$this->buildPacket();
			$this->startTime();
			socket_write($this->icmp_socket, $this->request, $this->request_len);

			if (socket_recv($this->icmp_socket, $this->reply, 256, 0)) {
				$this->time = $this->getTime($precision);
				return $this->time;
			}
			else {
				$this->errstr = "Timed out";
				return FALSE;
			}
		}
		else {
			$this->errstr = "Destination address not specified";
			return FALSE;
		}
	}
}
server_auf_verfuegbarkeit_pruefen.txt · Last modified: 2020/02/21 22:55 (external edit)