WinFuture-Forum.de: Cs:s Server Status Abfragen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Cs:s Server Status Abfragen


#1 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 19. April 2005 - 08:07

Huhu Leute,

hat schon jemand versucht den Status von einem Couterstrike Source server per PHP abzufragen? Nen fertiges Script würde mir auch schon reichen, habe aber bisher nur Scripts für 1.6 server gefunden und die gehen auf meinem server nicht.

Ich mnöchte kein Plugin auf dem Server installieren oder sowas.

soweit bin ich:

$server_ip    = "80.190.205.125";
$server_port = 27015;

$hlserver_con = fsockopen("udp://".$server_ip, $server_port);

// 4x 255 Bytes, String-Command und Zero-Byte schicken
fwrite($hlserver_con, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, "T", 0x00));

$server_data1 = fread($hlserver_con, 6); // den int32-Wert (4 Bytes) holen

$server_data2 = fread($hlserver_con, 24);
echo "Server Name: ".$server_data2."<br>";

$server_data3 = fread($hlserver_con, 12);
echo "Server Map: ".$server_data3."<br>";

$server_data4 = fread($hlserver_con, 8);
echo "Server Game: ".$server_data4."<br>";

$server_data5 = fread($hlserver_con, 14);
echo "Server Game: ".$server_data5."<br>";

$server_data6 = fread($hlserver_con, 14);
echo "Server 11: ".$server_data6."<br>";


so folgendes problem, so kann ich ja schön die infos byte nach byte holen, aber was ist wenn eine info aufeinmal länger ist, also wenn zb der servername größer ist?

das ist die erklärung zu den daten die man bekommt:

(int32) Header
(char) Character 'I'
(byte) Protocol Version
(string) Host Name
(string) Map Name
(string) Game Directory
(string) Game Description
(int32) Steam Application ID
(byte) Player Count
(byte) Max Players
(byte) Bot Count
(byte) Server Type (l=listen, d=dedicated)
(byte) Server OS (l=linux, w=windows)
(byte) Passworded
(byte) Secure Server


wie man die bytes abschneidet am anfang is mir klar, aber wie kann ich die strings direkt auslesen?

EDIT:::Hab alle Probleme bis jetzt gelöst, kann das fertige script posten wenn es wen interessiert, einfach runter schreiben

Dieser Beitrag wurde von MaliMaster bearbeitet: 19. April 2005 - 11:59

0

Anzeige



#2 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 19. April 2005 - 14:52

Moin,

also das wuerde mich doch schon sehr interessieren. Vielleicht kannst du dein fertiges Script ja mal posten. :D

Vielen Dank!
PW
0

#3 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 19. April 2005 - 15:58

<?php

/* === class_hlserver.inc ============================================= */

class hlserver
{
    var $ip; // Variable für die IP
    var $port; // Variable für den Port
    var $fp; // Variable für das File-Handle (die Verbindung)
    
    // weitere Variablen
    var $serverinfo;
    var $playerlist;
    var $cvarlist;
    
    // unsere erste Funktion ist der Klassen-Konstruktor
    function hlserver($server_address=0)
    {
        // keine IP angegeben?
        if($server_address == 0)
        {
            $this->ip   = "80.190.205.125";
            $this->port = 27015;
        }
        else
        {
            // $server_address, bestehend aus IP und Port (ip:port) aufsplitten
            list($this->ip, $this->port) = explode(':', $server_address);
        }
    }
    
    // Verbindung zum Server aufbauen
    function connect()
    {
        // UDP Verbindung aufbauen
        if(!$this->fp = fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, 3))
        {
            // Timeout setzen
            @socket_set_timeout($this->fp, 3);
            die(sprintf("Verbindung zu %s:%s konnte nicht hergestellt werden!", $this->ip, $this->port));
        }
    }
    
    // Verbindung schließen
    function disconnect()
    {
        if($this->fp)
        {
            fclose($this->fp);
        }
    }
    
    // String-Command senden
    function send_strcmd($strcmd)
    {
        fwrite($this->fp, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, $strcmd, 0x00));
    }
    
    // 1 Byte vom Server holen
    function get_byte()
    {
        return ord(fread($this->fp, 1));
    }
    
    // 1 Zeichen (1 Byte) vom Server holen
    function get_char()
    {
        return fread($this->fp, 1);
    }
    
    // einen int16-Wert (2 Bytes) vom Server holen
    function get_int16()
    {
        $unpacked = unpack('sint', fread($this->fp, 2));
        return $unpacked[int];
    }
    
    // einen int32-Wert (4 Bytes) vom Server holen
    function get_int32()
    {
        $unpacked = unpack('iint', fread($this->fp, 4));
        return $unpacked[int];
    }
    
    // einen float32-Wert (4 Bytes) vom Server holen
    function get_float32()
    {
        $unpacked = unpack('fint', fread($this->fp, 4));
        return $unpacked[int];
    }
    
    // einen String vom Server holen
    function get_string()
    {
        // so lange ein Zeichen vom Server holen, bis das Zero-Zeichen zurückgegeben wird
        while(($char = fread($this->fp, 1)) != chr(0))
        {
            $str .= $char;
        }
        
        return $str;
    }
    
    // Server-Ping ermitteln
    function ping()
    {
        $this->connect();
        
        $time1 = explode(' ', microtime());
        $this->send_strcmd("ping");
        $time2 = explode(' ', microtime());
        $this->serverinfo["ping"] = ($time2[0]-$time1[0])*1000000;
        
        $this->disconnect();
        
        return $serverinfo["ping"];
    }
    
    // Infos vom Server holen
    function infos()
    {
        $this->connect();
        $this->send_strcmd("T");
        $this->get_int32(); // -1
        $this->get_char(); // ASCII 'm' (S2A_INFO_DETAILED)
	$this->serverinfo["protokoll"]        = $this->get_byte();
        
        $this->serverinfo["name"]    = $this->get_string();
        $this->serverinfo["map"]        = $this->get_string();
        $this->serverinfo["directory"]  = $this->get_string();
        $this->serverinfo["discription"]= $this->get_string();
	$this->serverinfo["steam_id"]	= $this->get_int16(); 
        $this->serverinfo["players"]    = $this->get_byte();
        $this->serverinfo["maxplayers"] = $this->get_byte();
        $this->serverinfo["bot"]    = $this->get_byte();
        $this->serverinfo["type"]  = $this->get_byte();
        $this->serverinfo["os"]        = $this->get_byte();
        $this->serverinfo["password"]   = $this->get_byte();
        $this->serverinfo["secure"]     = $this->get_byte();
        
        
        if($this->serverinfo["type"] == 'd')
        {
            $this->serverinfo["type"] = "Dedicated";
        }
        else
        {
            $this->serverinfo["type"] = "Listen";
        }
        
        if($this->serverinfo["os"] == 'w')
        {
            $this->serverinfo["os"] = "Windows";
        }
        else
        {
            $this->serverinfo["os"] = "Linux";
        }
        
        if($this->serverinfo["password"] == '1')
        {
            $this->serverinfo["password"] = "Ja";
        }
        else
        {
            $this->serverinfo["password"] = "Nein";
        }
        
        $this->disconnect();
        
        return $this->serverinfo;
    }
    
    // Player-Liste vom Server holen
    function players()
    {
        $this->connect();
        
        $this->send_strcmd("U");
        $this->get_int32(); // -1
        $this->get_char(); // ASCII 'D' (S2A_PLAYERS)
        
        $playercount = $this->get_byte();
        
        for($i=0; $i < $playercount; $i++)
        {
            $this->playerlist[$i]["index"] = $this->get_byte();
            $this->playerlist[$i]["name"]  = $this->get_string();
            $this->playerlist[$i]["frags"] = $this->get_int32();
            $this->playerlist[$i]["time"]  = date('H:i:s', round($this->get_float32(), 0)+82800);
        }
        
        $this->disconnect();
        
        return $this->playerlist;
    }
    
    // Rules-Liste (CVARs) vom Server holen
    function cvars()
    {
        $this->connect();
        
        $this->send_strcmd("V");
        $this->get_int32(); // -1
        $this->get_char(); // ASCII 'E' (S2A_RULES)
        
        $cvarcount = $this->get_int16();
        
        for($i=0; $i < $cvarcount; $i++)
        {
            $this->cvarlist[$this->get_string()] = $this->get_string();
        }
        
        $this->disconnect();
        
        return $this->cvarlist;
    }
};

?>


das tutorial hab ich umgeschrieben, das war allerdings die cs 1.6 version:

http://www.resourcec...view.php?id=774

Dieser Beitrag wurde von MaliMaster bearbeitet: 19. April 2005 - 21:55

0

#4 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 20. April 2005 - 00:50

Herzlichen Dank!

PW
0

#5 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 19. Mai 2005 - 10:24

Da ich in den letzten Tagen mehrere Mail bekommen habe, habe ich das Script noch einmal an das neue Steamupdate angepasst.

Dazu habe ich ein Tutorial geschrieben was man hier lesen kann:

http://v160426.dd10214.kasserver.com/phpBB...c.php?p=188#188
0

#6 Mitglied ist offline   Sleg 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 19. Mai 2005 - 21:34

Hallo MaliMaster,
da du resourcecode.de erwähnt hast, vermute ich dass du das Tutorial von dort hast. Von dieser Seite hab ich auch meine Abfrage für die hl1 engine, was auch tadellos funktioniert. Ich versuche schon lange es so zu umzuschreiben, das ich auch source Server damit Abfragen kann, was du ja schon erfolgreich umgesetzt hast. Leider bin ich momentan nur am scheitern das nach deiner Anleitung umzuschreiben. Ich hab dein cs:s code genommen was du hier veröffentlicht hast und es nach deiner neuen Anleitung umgeschrieben, aber leider bekomme ich nur die Meldung dass ich keine Verbindung zum Server bekomme. Wäre es vielleicht möglich deine fertige cs:source class hier zu veröffentlichen?
0

#7 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 20. Mai 2005 - 07:00

Huhu Sleg,

also das jertztige Tutorial habe ich geschrieben, aus Anlass des neuen Steam Updates. Glaube iegntlich müsstest du nur alle Teile von dem Tutorial zusammen kopieren, dann sollte es theoretisch gehen. Ich hab nun ganz unten einen Link zu der Class erstellt, da kannst du dir die aktuelle angucken=)

Würde mich über ein kleines Statement in meinem Forum freuen, musst dich nichmal anmelden um etwas zu posten.. =)
0

#8 Mitglied ist offline   R1ddl3r 

  • Gruppe: Mitglieder
  • Beiträge: 4
  • Beigetreten: 26. Mai 05
  • Reputation: 0

geschrieben 26. Mai 2005 - 23:12

Ich sollte hier nochmal meinen Thread hinschreiben. Anweisung vom Moderator :wink:

Hallo, ich habe ein Scripte welches die Serverinformationen eines Gameservers ausliest. Nur funktioniert es nur bei CS 1.6 Servern.
Kann jemand das Script so umschreiben, dass es mit CS:Source Servern funktioniert? Es muss nicht beides unterstützen.
<?php

	// Daten
	$hl_server	= "212.227.65.149";
	$hl_port	= "27015";
	
	// Verbindung aufbauen
	$connection = fsockopen("udp://".$hl_server, $hl_port);
	fwrite($connection, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, "infostring", 0x00));
	fread($connection, 4);
	
	// Prüfen, ob der Server online ist
	if ($connection)  { $server["status"] = "Online"; }	
	else   	 { $server["status"] = "Offline"; }
	
	// Daten auslesen
	$status = socket_get_status($connection);
	while($status["unread_bytes"] != 0)
	{
   	 $daten .= fread($connection, 1);
   	 $status = socket_get_status($connection);
	}
	
	// Verbindung schließen
	fclose($connection);
	//echo $daten;
	
	// Daten in Array speichern
	$daten = explode("\\", $daten);
	$server["version"] 	 = $daten[2];
	$server["adresse"]  = $daten[4];
	$server["spieler"]  = $daten[6];
	$server["hltvproxy"]	= $daten[8];
	if($daten[10] == 1)  { $server["lan"] = "LAN"; }
	else   	 { $server["lan"] = "Online"; }
	$server["maxspieler"]	= $daten[12];
	$server["verzeichnis"]	= $daten[16];
	$server["mod"] 	 = $daten[18];
	$server["name"] 	 = $daten[20];
	$server["map"] 	 = $daten[22];
	if($daten[24] == "d")  { $server["typ"] = "Dedicated"; }
	else      { $server["typ"] = "Listen"; }
	if($daten[26] == 1)  { $server["pass"]= "Ja"; }
	else   	 { $server["pass"]= "Nein"; }
	if($daten[28] == "w")	{ $server["os"]  = "Windows"; }
	else      { $server["os"]  = "Linux"; }
	
	// Template laden
	$ausgabe = file_get_contents("server.html");
	
	// Template ersetzen
	$ausgabe = str_replace("[STATUS]", 	 $server['status'], 	 $ausgabe);
	$ausgabe = str_replace("[NAME]", 	 $server['name'], 	 $ausgabe);
	$ausgabe = str_replace("[ADRESSE]",  $server['adresse'],  $ausgabe);
	$ausgabe = str_replace("[MAP]", 	 $server['map'], 	 $ausgabe);
	$ausgabe = str_replace("[SPIELER]",  $server['spieler'],  $ausgabe);
	$ausgabe = str_replace("[SPIELERMAX]",  $server['maxspieler'],  $ausgabe);
	$ausgabe = str_replace("[MOD]", 	 $server['mod'], 	 $ausgabe);
	$ausgabe = str_replace("[VERZEICHNIS]", $server['verzeichnis'], $ausgabe);
	$ausgabe = str_replace("[TYP]", 	 $server['typ'], 	 $ausgabe);
	$ausgabe = str_replace("[LAN]", 	 $server['lan'], 	 $ausgabe);
	$ausgabe = str_replace("[OS]",    $server['os'],    $ausgabe);
	$ausgabe = str_replace("[PASS]", 	 $server['pass'], 	 $ausgabe);
	
	// Daten ausgeben
	echo $ausgabe;

?>

0

#9 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 27. Mai 2005 - 17:17

Zitat (R1ddl3r: 26.05.2005, 16:12)

Ich sollte hier nochmal meinen Thread hinschreiben. Anweisung vom Moderator ;)<{POST_SNAPBACK}>


Was er meinte war, glaube ich, nicht, dass du deinen Beitrag nochmal posten sollst, sondern vielmehr, dass du dir diesen Thread mal durchlesen sollst. Ueber dir steht naemlich genau das, was du suchst.

PelzigesWaldtier
0

#10 Mitglied ist offline   R1ddl3r 

  • Gruppe: Mitglieder
  • Beiträge: 4
  • Beigetreten: 26. Mai 05
  • Reputation: 0

geschrieben 27. Mai 2005 - 17:45

Zitat

nein, schreibe im css script weiter und stelle da deine frage.

mfg
xandros


Ich glaube den Satz verstehe ich schon noch.
Danke aber das du besser weißt, was ich für PM's kriege ;).
0

#11 _Benjamin_

  • Gruppe: Gäste

geschrieben 29. Mai 2005 - 23:41

Zitat (R1ddl3r: 27.05.2005, 18:45)

Ich glaube den Satz verstehe ich schon noch.
Danke aber das du besser weißt, was ich für PM's kriege :rolleyes:.
<{POST_SNAPBACK}>


1. ich habe dir 2 mal gesagt ließ dir diesen thread hier KOMPLETT durch und stelle dann deine anfrage erneut wenn dir etwas unklar ist. hier ist eine lösung bereits aufgezeichnet ... da muss dir keiner dein script umschreiben.

2. hier wird dir hilfe angeboten ... stell nur sachlich deine fragen ...
0

#12 Mitglied ist offline   R1ddl3r 

  • Gruppe: Mitglieder
  • Beiträge: 4
  • Beigetreten: 26. Mai 05
  • Reputation: 0

geschrieben 31. Mai 2005 - 15:56

Leider schickt mir der Threadauthor das Script nicht.
Deshalb hilft es mir wenig.
Hat jemand schon das Script von ihn?
0

#13 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 14. Juni 2005 - 07:09

sorry hab nichtmehr hier geguck nur noch in meinem forum!

http://v160426.dd102....com/server.zip

Dieser Beitrag wurde von MaliMaster bearbeitet: 14. Juni 2005 - 07:11

0

#14 Mitglied ist offline   linksta 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.319
  • Beigetreten: 16. Dezember 04
  • Reputation: 2

geschrieben 14. Juni 2005 - 07:15

sieht doch gut aus
probier ich nacher mal aus

geil es funzt

echt cooles script danke an dich

Dieser Beitrag wurde von linksta bearbeitet: 14. Juni 2005 - 19:02

auf unbestimmte zeit offline
<3 Adblock
0

#15 Mitglied ist offline   msne1012 

  • Gruppe: Mitglieder
  • Beiträge: 2
  • Beigetreten: 14. Juni 05
  • Reputation: 0

  geschrieben 14. Juni 2005 - 22:27

Hat jemand eine Idee wie man seit dem letzten Steamupdate (gestern oder so) die alten Serverabfragen für CS 1.6 Server wieder zum laufen bringt? Geht seit dem nämlich leider nicht mehr die haben da wohl den Code etwas verändert.

habe immer das Script vom HBT-Clan genutzt, super Teil in der neueren Version für CS:S und CS 1.6 gedacht nur leider gehts seit 2 Tagen nimmer mit 1.6.

falls mal jmd testen will hier mal ein Downloadlink >>>
serverstatus.rar

danke schon mal
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0