• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Keine Fehlermeldung bekommen

lasse071

New member
Hallo Community, ich suche eine möglichkeit in meinen Script die fehlermeldung weg zu lassen.
Mein Script zeigt den Status die Spieleranzahl die Ping die Motd das Logo und die Version eines Minecraft Servers an.
Wen ich den Server an habe ist alles ok alles wird so wie ich es will ausgegeben
bandicam 2014-04-30 14-37-00-320.jpg.

Wen er aber Offline ist wird eine lange Fehlermeldung ausgeben und es sieht wie folgend aus:
bandicam 2014-04-30 14-39-15-188.jpg

Meine frage ist nun wie gesacht was muss ich an den Script(ganz unten) ändern damit nur das mit Status: Offline Ping: ? ... ausgegeben wird ohne die Fehlermeldung.

Ich hoffe jemand kann mir helfen!

Alles gute, lasse071

Ausgabe Datei:
Code:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
.class1{ float:left; margin:10px; background:#0000FF; width:200px; height:150px; cursor:pointer; }
.class2{ float:left; margin:10px; background:#00FF00; width:200px; height:150px; cursor:pointer; }
</style>
<script>
function toggleClass(el){
	if(el.className == "class1"){
		el.className = "class2";
	} else {
		el.className = "class1";
	}
}
</script>
</head>
<body>
<div class="class1" onclick="toggleClass(this)"><?php

	include_once 'MinecraftServerStatus/status.class.php';
	$status = new MinecraftServerStatus();
	$response = $status->getStatus('grexcraft.no-ip.org');
	if(!$response) {
		echo"Status: Offline <br>
		      Version: ? <br>
			  Spieler: ? <br>
			  Motd: ? <br>
			  Ping: ?";
	} else {
		echo"<img width=\"64\" height=\"64\" src=\"".$response['favicon']."\" /> <br>
	    Version: ".$response['version']." <br>
		Spieler: ".$response['players']."/".$response['maxplayers']."<br>
		Motd: ".$response['motd']." <br>
		Ping: ".$response['ping']." millisekunden";
	} 

?></div>
</body>
</html>

Status Prüfung:
PHP:
<?php


    class MinecraftServerStatus {

        private $timeout;

        public function __construct($timeout = 2) {
            $this->timeout = $timeout;
        }

        public function getStatus($host = '127.0.0.1', $version = '1.7.*' , $port = 25565) {

            if (substr_count($host , '.') != 4) $host = gethostbyname($host);

            $serverdata = array();
            $serverdata['hostname'] = $host;
            $serverdata['version'] = false;
            $serverdata['protocol'] = false;
            $serverdata['players'] = false;
            $serverdata['maxplayers'] = false;
            $serverdata['motd'] = false;
            $serverdata['motd_raw'] = false;
            $serverdata['favicon'] = false;
            $serverdata['ping'] = false;

            $socket = $this->connect($host, $port);

            if(!$socket) {
                return false;
            }

            if(preg_match('/1.7|1.8/',$version)) {

                $start = microtime(true);

                $handshake = pack('cccca*', hexdec(strlen($host)), 0, 0x04, strlen($host), $host).pack('nc', $port, 0x01);

                socket_send($socket, $handshake, strlen($handshake), 0); 
                socket_send($socket, "\x01\x00", 2, 0);
                socket_read( $socket, 1 );

                $ping = round((microtime(true)-$start)*1000); 

                $packetlength = $this->read_packet_length($socket);

                if($packetlength < 10) {
                    return false;
                }

                socket_read($socket, 1);

                $packetlength = $this->read_packet_length($socket);

                $data = socket_read($socket, $packetlength, PHP_NORMAL_READ);

                if(!$data) {
                    return false;
                }

                $data = json_decode($data);

                $serverdata['version'] = $data->version->name;
                $serverdata['protocol'] = $data->version->protocol;
                $serverdata['players'] = $data->players->online;
                $serverdata['maxplayers'] = $data->players->max;

                $motd = $data->description;
                $motd = preg_replace("/(§.)/", "",$motd);
                $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd);

                $serverdata['motd'] = $motd;
                $serverdata['motd_raw'] = $data->description;
                $serverdata['favicon'] = $data->favicon;
                $serverdata['ping'] = $ping;

            } else {

                $start = microtime(true);

                socket_send($socket, "\xFE\x01", 2, 0);
                $length = socket_recv($socket, $data, 512, 0);

                $ping = round((microtime(true)-$start)*1000);
                
                if($length < 4 || $data[0] != "\xFF") {
                    return false;
                }

                $motd = "";
                $motdraw = "";

                
                if (substr((String)$data, 3, 5) == "\x00\xa7\x00\x31\x00"){

                    $result = explode("\x00", mb_convert_encoding(substr((String)$data, 15), 'UTF-8', 'UCS-2'));
                    $motd = $result[1];
                    $motdraw = $motd;

                } else {

                    $result = explode('§', mb_convert_encoding(substr((String)$data, 3), 'UTF-8', 'UCS-2'));
                        foreach ($result as $key => $string) {
                            if($key != sizeof($result)-1 && $key != sizeof($result)-2 && $key != 0) {
                                $motd .= '§'.$string;
                            }
                        }
                        $motdraw = $motd;
                    }

                    $motd = preg_replace("/(§.)/", "", $motd);
                    $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd); 

                    $serverdata['version'] = $result[0];
                    $serverdata['players'] = $result[sizeof($result)-2];
                    $serverdata['maxplayers'] = $result[sizeof($result)-1];
                    $serverdata['motd'] = $motd;
                    $serverdata['motd_raw'] = $motdraw;
                    $serverdata['ping'] = $ping;

            }

            $this->disconnect($socket);

            return $serverdata;

        }

        private function connect($host, $port) {
            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            socket_connect($socket, $host, $port); 
            return $socket;
        }

        private function disconnect($socket) {
            if($socket != null) {
                socket_close($socket);
            }
        }

        private function read_packet_length($socket) {
            $a = 0;
            $b = 0;
            while(true) {
                $c = socket_read($socket, 1);
                if(!$c) {
                    return 0;
                }
                $c = Ord($c);
                $a |= ($c & 0x7F) << $b++ * 7;
                if( $b > 5 ) {
                    return false;
                }
                if(($c & 0x80) != 128) {
                    break;
                }
            }
            return $a;
        }

    }
 
Zuletzt bearbeitet von einem Moderator:
Du musst serverseitig im PHP eine Prüfung einbauen, ob das Ziel erreichbar ist. Daher auch verschoben.
 
Du musst in der connect()-Methode den Rückgabewert von socket_connect() überprüfen. Wenn das false zurückkommt, war da was falsch und du kann das Socket gleich wieder schließen und auch false zurückgeben - dann weißt du auch in der getStatus() dass der Server nicht erreichbar ist.
 
Zurück
Oben