Problem mit fgets bei fsockopen.

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi

ich habe ein ärgerliches Problem mit der Funktion fgets. Ich schreibe zur Zeit ein sogenanntes Rcon-Tool für Call of Duty 4, mit dem man dem Gameserver per Browser Befehle zukommenlassen kann, ohne selbst im Spiel eingeloggt zu sein.
Das ganze funktioniert, bis auf einen Haken. Wenn ich die Spielerliste holen möchte (befehl /rcon status) gibt es genau 2 Optionen.
1) Ich erhalte nicht die ganze Fehler liste
2) Ich lande in einer sehr langen Schleife, und erhalte gar kein Ergebnis (wenn die Seite zu Ende geladen hat => Quelltext wird nicht weiter geladen.)

Der Code:
PHP:
<?php
error_reporting('E_ALL');
class rcon{
  private $ip;
  private $port;
  private $pass;
  private $command;
  private $handle;
  public function __construct($ip,$port,$pass){
    $this->ip = $ip;
    $this->port = $port;
    $this->pass = $pass;
    $this->command = str_repeat(chr(255), 4);
  }
  public function connect(){
    $this->handle = fsockopen('udp://'.$this->ip, $this->port, $errno, $errstr);
    if (!$this->handle)
      die('Unable to open socket connection: '.$errstr.' (#'.$errno.')');

  }
  public function disconnect(){
    fclose($this->handle);
  }
  public function cmd($cmd){
    if( !fwrite($this->handle,$this->command.' rcon '.$this->pass.' '.$cmd."\n") )
      die('Failed to send command.');
    $fp = $this->handle;
    $runs = 1;
    $response = '';
    while( true ){
        if( feof($this->handle) )
          die('FEOF');
        $f = fgets($fp);
        $response .= $f;
        if( feof($this->handle) )
          die('FEOF');
        if($runs == 25){ break;}else $runs++; 
    }
    return str_replace('','',$response);
  }
}
$rcon = new rcon('94.76.214.117', 1024, '*********');
$rcon->connect();
?>
<pre>
<? var_dump($rcon->cmd('status')); ?>
</pre>
<?php
$rcon->disconnect();
?>

Anmerkungen:
-Es wird _nie_ FEOF ausgegeben.
-Jenachdem wieviele Spieler online sind (sprich Länge des Rückgabestrings) müsste die Anzahl bei $runs erhöht oder verringert werden um den kompletten Satz zu erhalten.
 
Zurück