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><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]]! |