Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
tutorial:server:php_querry_script [2009/11/13 16:40] HSFighter |
tutorial:server:php_querry_script [2012/11/02 02:31] (aktuell) HSFighter [Funktion für die Auswertung] |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== PHP Server-Query Script ====== | + | ====== PHP HL² Server-Query Script ====== |
Das hier ist ein Tutorial für ein PHP Server-Query Script | Das hier ist ein Tutorial für ein PHP Server-Query Script | ||
das Informationen von einem HL2/CS:S Server auslesen und anzeigen kann. | das Informationen von einem HL2/CS:S Server auslesen und anzeigen kann. | ||
Zeile 8: | Zeile 8: | ||
Ein Script, was nur halb funktionierte und kaum eine Funktionierende Funktion hatte. | Ein Script, was nur halb funktionierte und kaum eine Funktionierende Funktion hatte. | ||
Nach und nach haben wir beide noch Funktionen hinzugefügt, geändert und verbessert.\\ \\ | Nach und nach haben wir beide noch Funktionen hinzugefügt, geändert und verbessert.\\ \\ | ||
- | |||
- | Da Ich nicht mehr weiß wo ich das Original Tutorial gefunden habe, | ||
- | bevor wir es geändert haben, | ||
- | bitte ich den Autor der Das Grundgerüst geschrieben hat sich mal hier zu melden | ||
- | oder mir eine PM zu schrieben wenn er das hier liest! | ||
Hier mal ein Beispiel wie das Ergebnis ausschaut: [[http://www.server.hsfighter.net]] | Hier mal ein Beispiel wie das Ergebnis ausschaut: [[http://www.server.hsfighter.net]] | ||
Zeile 23: | Zeile 18: | ||
* Daten ins Array laden | * Daten ins Array laden | ||
- | **Um Player vom Server ab zu fragen (z.B. Playername, Frags usw.), muss man eine Art "Ticket" anfordern. Dieses Ticket ist # eine begrenzte Zeit gültig und ermöglicht es die Informationen zu bekommen.** | + | **Um Player vom Server ab zu fragen (z.B. Playername, Frags usw.), |
- | Verbindung zum Server herstellen | + | muss man eine Art "Ticket" anfordern. |
+ | Dieses Ticket ist # eine begrenzte Zeit gültig und ermöglicht es die Informationen zu bekommen.** | ||
+ | * Verbindung zum Server herstellen | ||
* Ein Ticket anfordern (//Challenge//) | * Ein Ticket anfordern (//Challenge//) | ||
* Einen Wert zum Server schicken mit angehängten Ticket (//das was wir vorher abgefragt haben//) | * Einen Wert zum Server schicken mit angehängten Ticket (//das was wir vorher abgefragt haben//) | ||
Zeile 40: | Zeile 37: | ||
} </code> | } </code> | ||
+ | |||
==== Variablen deklarieren ==== | ==== Variablen deklarieren ==== | ||
Jetzt werden wir erst mal unsere wichtigsten Variablen deklarieren und einige schon mit Werten füllen da wir diese Werte dann nachher zu unserem Gameserver Senden: | Jetzt werden wir erst mal unsere wichtigsten Variablen deklarieren und einige schon mit Werten füllen da wir diese Werte dann nachher zu unserem Gameserver Senden: | ||
Zeile 51: | Zeile 49: | ||
var $cvarlist; | var $cvarlist; | ||
- | var $A2S_SERVERQUERY_GETCHALLENGE = "\x57"; // challenge | + | var $A2S_SERVERQUERY_GETCHALLENGE = "\x55\xFF\xFF\xFF\xFF"; // challenge |
var $A2S_INFO = "TSource Engine Query\x00"; // info | var $A2S_INFO = "TSource Engine Query\x00"; // info | ||
var $A2S_PLAYER = "\x55"; // player | var $A2S_PLAYER = "\x55"; // player | ||
Zeile 60: | Zeile 58: | ||
<code=php>function hlserver($server_address = 0) { | <code=php>function hlserver($server_address = 0) { | ||
list($this->ip, $this->port) = explode(":", $server_address); | list($this->ip, $this->port) = explode(":", $server_address); | ||
- | } <code=php>[b]Funktion um eine Verbindung zum Server aufzubauen:[/b]<code=php>function connect() { | + | } </code> |
+ | ====Funktion um eine Verbindung zum Server aufzubauen:==== | ||
+ | <code=php>function connect() { | ||
$this->fp = fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, 3); | $this->fp = fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, 3); | ||
if (!$this->fp) { | if (!$this->fp) { | ||
Zeile 66: | Zeile 66: | ||
} | } | ||
} </code> | } </code> | ||
- | Damit stellen wir eine und Verbindung zu unserem Server her und speichern sie in der Variablen "[b][i]$this->fp[/i][/b]". | + | Damit stellen wir eine und Verbindung zu unserem Server her und speichern sie in der Variablen "//**$this->fp**//". |
Die Funktion ''fsockopen'' brauch dazu die beiden Variablen mit der IP und dem PORT.\\ \\ | Die Funktion ''fsockopen'' brauch dazu die beiden Variablen mit der IP und dem PORT.\\ \\ | ||
==== Funktion um mit dem Server zu kommunizieren ==== | ==== Funktion um mit dem Server zu kommunizieren ==== | ||
- | <code=php>function [b]send_strcmd[/b]($strcmd) { | + | <code=php>function send_strcmd($strcmd) { |
fwrite($this->fp, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, $strcmd, 0x00)); | fwrite($this->fp, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, $strcmd, 0x00)); | ||
} </code> | } </code> | ||
Wir benutzten die Funktion ''fwrite''. | Wir benutzten die Funktion ''fwrite''. | ||
- | Wir brauchen uns mit dem Rest nicht auseinander setzten, nur die Variable "[b][i]$strcmd[/i][/b]" ist noch interessant. | + | Wir brauchen uns mit dem Rest nicht auseinander setzten, nur die Variable "//**$strcmd**// ist noch interessant. |
Damit werden später die Daten übergeben, die wir zum Server schicken. | Damit werden später die Daten übergeben, die wir zum Server schicken. | ||
==== Funktion für die Auswertung ==== | ==== Funktion für die Auswertung ==== | ||
- | Jetzt brauchen wir Funktionen, die die Daten auswertet die uns der Server zurück schick.[/b] Man muss sich das folgendermaßen vorstellen:\\ | + | Jetzt brauchen wir Funktionen, die die Daten auswertet die uns der Server zurück schick. Man muss sich das folgendermaßen vorstellen:\\ |
Der Server schickt uns eine Kette mit Informationen, die alle hintereinander kommen. Die müssen wir an bestimmten stellen trennen, damit wir die Informationen unterteilen können.\\ | Der Server schickt uns eine Kette mit Informationen, die alle hintereinander kommen. Die müssen wir an bestimmten stellen trennen, damit wir die Informationen unterteilen können.\\ | ||
Zeile 97: | Zeile 97: | ||
function get_int16() { | function get_int16() { | ||
$unpacked = unpack('sint', fread($this->fp, 2)); | $unpacked = unpack('sint', fread($this->fp, 2)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
Zeile 103: | Zeile 103: | ||
function get_int32() { | function get_int32() { | ||
$unpacked = unpack('iint', fread($this->fp, 4)); | $unpacked = unpack('iint', fread($this->fp, 4)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
Zeile 109: | Zeile 109: | ||
function get_float32() { | function get_float32() { | ||
$unpacked = unpack('fint', fread($this->fp, 4)); | $unpacked = unpack('fint', fread($this->fp, 4)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
// einen String vom Server holen | // einen String vom Server holen | ||
function get_string() { | function get_string() { | ||
+ | $str = ''; | ||
while(($char = fread($this->fp, 1)) != chr(0)) { | while(($char = fread($this->fp, 1)) != chr(0)) { | ||
$str .= $char; | $str .= $char; | ||
Zeile 134: | Zeile 135: | ||
$this->get_byte(); | $this->get_byte(); | ||
$challenge = $this->get_4(); | $challenge = $this->get_4(); | ||
- | return $challenge; | ||
fclose($this->fp); | fclose($this->fp); | ||
+ | return $challenge; | ||
+ | |||
} </code> | } </code> | ||
Wir benutzen unsere Verbindungsfunktionen und übergeben den Wert "//**W**//" (//**\x57**//) den wir vorher bei der Deklaration in die Variable "//**A2S_SERVERQUERY_GETCHALLENGE**//" geschrieben haben.\\ | Wir benutzen unsere Verbindungsfunktionen und übergeben den Wert "//**W**//" (//**\x57**//) den wir vorher bei der Deklaration in die Variable "//**A2S_SERVERQUERY_GETCHALLENGE**//" geschrieben haben.\\ | ||
Zeile 216: | Zeile 218: | ||
===== Zusammenfassung der Klasse ===== | ===== Zusammenfassung der Klasse ===== | ||
<code=php><?php | <code=php><?php | ||
+ | /** | ||
+ | * ============================================================================= | ||
+ | * This class will get infos from a HL2 server over php | ||
+ | * | ||
+ | * @author HSFighter | ||
+ | * @special thx to Chrisber | ||
+ | * @version 1.1.0 | ||
+ | * @package PHP Server-Query Script | ||
+ | * @link http://sourceserver.info | ||
+ | * | ||
+ | * @version 1.1.0: serverstatus.class.php by hsfighter $ | ||
+ | * ============================================================================= | ||
+ | */ | ||
+ | |||
class HLServerAbfrage { | class HLServerAbfrage { | ||
Zeile 228: | Zeile 244: | ||
- | var $A2S_SERVERQUERY_GETCHALLENGE = "\x57"; // challenge | + | var $A2S_SERVERQUERY_GETCHALLENGE = "\x55\xFF\xFF\xFF\xFF"; // challenge |
var $A2S_INFO = "TSource Engine Query\x00"; // info | var $A2S_INFO = "TSource Engine Query\x00"; // info | ||
var $A2S_PLAYER = "\x55"; // player | var $A2S_PLAYER = "\x55"; // player | ||
Zeile 264: | Zeile 280: | ||
function get_int16() { | function get_int16() { | ||
$unpacked = unpack('sint', fread($this->fp, 2)); | $unpacked = unpack('sint', fread($this->fp, 2)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
Zeile 270: | Zeile 286: | ||
function get_int32() { | function get_int32() { | ||
$unpacked = unpack('iint', fread($this->fp, 4)); | $unpacked = unpack('iint', fread($this->fp, 4)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
Zeile 276: | Zeile 292: | ||
function get_float32() { | function get_float32() { | ||
$unpacked = unpack('fint', fread($this->fp, 4)); | $unpacked = unpack('fint', fread($this->fp, 4)); | ||
- | return $unpacked[int]; | + | return $unpacked["int"]; |
} | } | ||
// einen String vom Server holen | // einen String vom Server holen | ||
function get_string() { | function get_string() { | ||
+ | $str = ''; | ||
while(($char = fread($this->fp, 1)) != chr(0)) { | while(($char = fread($this->fp, 1)) != chr(0)) { | ||
$str .= $char; | $str .= $char; | ||
Zeile 300: | Zeile 317: | ||
$this->get_byte(); | $this->get_byte(); | ||
$challenge = $this->get_4(); | $challenge = $this->get_4(); | ||
- | return $challenge; | ||
fclose($this->fp); | fclose($this->fp); | ||
+ | return $challenge; | ||
+ | |||
} | } | ||
Zeile 373: | Zeile 391: | ||
// Server Angaben | // Server Angaben | ||
- | $ip = '85.131.170.95'; | + | $ip = '176.57.137.35'; |
$port = '27015'; | $port = '27015'; | ||
$mappic_path = 'http://meine-hp.de/mappics/css/'; | $mappic_path = 'http://meine-hp.de/mappics/css/'; | ||
Zeile 459: | Zeile 477: | ||
Auf dieses Tutorial darf frei Verlinkt werden.\\ | Auf dieses Tutorial darf frei Verlinkt werden.\\ | ||
So lange es hier im Wiki auf sourceserver.info verbleibt.\\ | So lange es hier im Wiki auf sourceserver.info verbleibt.\\ | ||
- | Wenn ihr das Tutorial oder Teile davon wo anders verwenden möchtet, bitte eine PM an [[http://sourceserver.info/memberlist.php?mode=viewprofile&u=57|HSFighter]]! | + | Wenn ihr das Tutorial oder Teile davon wo anders verwenden möchtet, bitte eine PM an [[http://sourceserver.info/user/57-hsfighter|HSFighter]]! |