Hallo zusammen,
ich habe fuer eine Page 2 Klassen gefunden, die mir ( in diesem Fall ) die Stati von 2 Gameservern liefern. Das ganze funktioniert mit Socketverbindungen.
Hier die Klasse fuer einen Counterstrike Source Server ( die andere fuer 1.6 funktioniert wunderbar)
Problem:
Ich rufe die Seite auf, und es funktioniert manchmal alles wie es soll.
Manchmal warte ich ewig auf das Laden der Seite und es tut sich nix.
Danach allerdings wenn ich danach einen anderen Link anklicke (der mit der Socketsache garnix zu tun haben muss) muss ich ewig auf einen Seitenaufbau warten.
Kein Time out passiert.. die Seite läd einfach ewig vor sich hin ?!
Kann jemand von euch mit diesen Symptomen was anfangen ?
Habe ich da irgendwas vergessen abzufangen?
Ein ...
... ist gesetzt also, sollte die Klasse nach 3 Sekunden das ganze Abbrechen, dalls die Socketverbindung nicht funktioniert.
Hier mal die ganze Klasse:
aufgerufen wird das ganze mit :
Sorry für den vielen Code, aber ich hab leider keine Schimmer, wie ich Fehlersuceh betreiben sollte dabei.
Kann man irgendwie abfragen/ausgeben ob der Webserver irgendwelche Connectiosn noch offen hat oderso ?
Danke
Gruß
Frank
ich habe fuer eine Page 2 Klassen gefunden, die mir ( in diesem Fall ) die Stati von 2 Gameservern liefern. Das ganze funktioniert mit Socketverbindungen.
Hier die Klasse fuer einen Counterstrike Source Server ( die andere fuer 1.6 funktioniert wunderbar)
Problem:
Ich rufe die Seite auf, und es funktioniert manchmal alles wie es soll.
Manchmal warte ich ewig auf das Laden der Seite und es tut sich nix.
Danach allerdings wenn ich danach einen anderen Link anklicke (der mit der Socketsache garnix zu tun haben muss) muss ich ewig auf einen Seitenaufbau warten.
Kein Time out passiert.. die Seite läd einfach ewig vor sich hin ?!
Kann jemand von euch mit diesen Symptomen was anfangen ?
Habe ich da irgendwas vergessen abzufangen?
Ein ...
Code:
socket_set_timeout($this->fp, 3);
... ist gesetzt also, sollte die Klasse nach 3 Sekunden das ganze Abbrechen, dalls die Socketverbindung nicht funktioniert.
Hier mal die ganze Klasse:
Code:
<?php
/* === class_hlserver.inc ============================================= */
class sourceserver
{
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;
}
};
?>
aufgerufen wird das ganze mit :
Code:
$cssserver = new sourceserver('css.maze-esports.de:27015');
$css_info = $cssserver->infos();
$css_player = $cssserver->players();
// ausgabe der daten.....
Sorry für den vielen Code, aber ich hab leider keine Schimmer, wie ich Fehlersuceh betreiben sollte dabei.
Kann man irgendwie abfragen/ausgeben ob der Webserver irgendwelche Connectiosn noch offen hat oderso ?
Danke
Gruß
Frank
Zuletzt bearbeitet: