Serverstatus

Voggi

Gesperrt
Hi,
ich will von nem Gameserver den Status anzeigen lassen. Ich hab mir gedacht, dass es so möglich sein müsste:
PHP:
$ip = "81.***.***.***";
$port = "1500";

$fp = fsockopen("udp://$ip", $port);
if (!$fp) 
{
echo "Server down!";
} 
else 
{
echo "Server online!";
}
Mir wird aber immer Server online! angezeigt, auch wenn der Gameserver down ist. Hab ich da irgendwo nen Fehler drin?
 
Hi!

Um ehrlich zu sein, weiß ich nicht, wofür das Protokoll "UDP" steht. In einem der Beispiele im Manual wird eine Verbindung zu einem www-Server ohne Angabe eines Protokolls durchgeführt. Vielleicht musst du bei deinem Spiele-Server das Protokoll nicht anführen?

Außerdem: Hast du mal über deinen lokalen Rechner probiert, ob du wenn der Server down ist, eine Verbindung zu dem jeweiligen Port herstellen kannst? (zum Beispiel per Telnet) Eventuell bleibt der Port ja auch bei abgestürztem / ausgeschaltetem Game-Server offen, sodass eine Verbindung hergestellt werden kann. In diesem Fall wäre der Aufbei einer Spielverbindung halt nur nicht möglich.

Außerdem II: Die Portangabe soll vom Typ INTEGER sein, du übergibst einen String. Eigentlich ist PHP bei soetwas immer recht tolerant, aber man weiß ja nie .....

Mamphil
 
Die Verbindung passt meiner Meinung nach schon.
Ich denk mal, dass es nur an dem liegt:
PHP:
if (!$fp) 
{ 
echo "Server down!"; 
} 
else 
{ 
echo "Server online!"; 
}
 
Hi!

PHP:
if (!$fp) 
{ 
echo "Server down!"; 
} 
else 
{ 
echo "Server online!"; 
}
Da ist garantiert kein Fehler drin. Wenn, musst du den Fehler in dieser Zeile suchen:
PHP:
$fp = fsockopen("udp://$ip", $port);

Probier ansonsten mal folgendes:
PHP:
if ($fp = @fsockopen("udp://$ip", $port))
  {
  echo 'Server online!';
  fclose($fp); // Der Sauberkeit halber solltest du die Verbindung wieder schließen!
  }
else
  echo 'Server offline!';

Mamphil
 
Ich zitiere mal php.net:

Warning
UDP sockets will sometimes appear to have opened without an error, even if the remote host is unreachable. The error will only become apparent when you read or write data to/from the socket. The reason for this is because UDP is a "connectionless" protocol, which means that the operating system does not try to establish a link for the socket until it actually needs to send or receive data.

Also solltest du vielleicht versuchen – wenn irgendwie möglich – Daten von der Socket-Verbindung zu lesen oder Daten zu schreiben, um den Online-/Offlinestatus richtig ermitteln zu können.
 
ludz hat gesagt.:
Also solltest du vielleicht versuchen – wenn irgendwie möglich – Daten von der Socket-Verbindung zu lesen oder Daten zu schreiben, um den Online-/Offlinestatus richtig ermitteln zu können.

Hmm, das Problem ist, dass es sich um einen America's Army Server handelt. Und ich hab keine Ahnung, ob man da irgendwelche Daten lesen kann.
 
Hi!

Dann probier es doch einfach mal, indem du dir die Daten ausgeben lässt! Wenn was kommt (keine Fehlermeldung, die unterdrückst du evtl. per "@" vorm Befehl), dann weißt du, wie du den Serverstatus überprüfen kannst.

Mamphil
 
Sorry, ich versteh jetz nicht wie du das meinst. Könntest du da vielleicht mal ein kleines Beispiel machen?
 
Eigentlich sollte es doch reichen irgendwas an den Server zu schicken um den Status zu überprüfen (also mit fputs irgend en String hinschicken).
Wenn es etwas sein soll, dass der Server auch mit Sicherheit versteht, dann musst du vorher noch gucken wie man mit den AA Servern vernünftig kommuniziert.
Würd's ja testen, hab aber derzeit kein Webserver lokal zur Verfügung.
 
leider hab ich keinen query den ich da hinsenden könnte um mehr zu erfahren also will ich von ihm einfach ein paar kleinere returns
soweit bekommste nun den on/offline status

PHP:
<?
$host =  "213.228.239.185:1716";

/** METHOD **/
function getServerStatus($host, $port, $query, $noErr)
{
  if (($ds = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0) {
    echo "socket_create() failed: reason: ".socket_strerror(socket_last_error($ds))."\n";
      exit;
  }
  $ia = gethostbyname($host);
  if(@socket_connect($ds, $ia, $port)===FALSE) {
    echo "socket_connect() failed: reason: ".socket_strerror(socket_last_error($ds))."\n";
    exit;
  }
  if(@socket_write($ds, $query, strlen($query))===FALSE) {
    echo "socket_write() failed: reason: ".socket_strerror(socket_last_error($ds))."\n";
    exit;
  }
  if(FALSE===($in = @socket_read($ds, 65506)) && !noErr) {
    echo "socket_read() failed: reason: ".socket_strerror(socket_last_error($ds))."\n";
    exit;
  }
  socket_close($ds);
  return $in;
}
/** /METHOD **/

$host= trim($host);
$ip=strtok($host, ":");
$port=strtok(":");
$query = "\xff\xff\xff\xffempty";
$in = getServerStatus($ip,$port, $query, 0);

if($in == "")
echo "server is offline";
else
echo "server is online";
?>
 
Zuletzt bearbeitet:
Zurück