Probleme mit dem Auslesen mehrer Zeilen per fgets

Read

Grünschnabel
Hi,


ich bin dabei für die kommende Teamspeak 3 Version eine Klasse zu programmieren. Bei Teamspeak 2 hatte ich keinerlei Probleme, doch bei TS3 finde ich beim Auslesen mehrer Zeilen einfach kein Ende.

Ich hoffe ihr habt in vergleichbaren Situationen ähnliche Erfahrungen gemacht oder helft mir einfach nur vom Schlau ;)

Im folgenden ein Vergleich zwischen den beiden Versionen.


Auszug aus dem Terminal Client mit Verbindung zum Teamspeak 2 Server:

Code:
[TS]
ver
2.0.24.1 Linux Freeware
OK

Dazugehöriger PHP Code

PHP:
function connect($ip, $tcp, $timeout = 3) {
		
		$this->__construct();
    	
		if(!$this->connection = @fsockopen($ip, $tcp, $errno, $errstr, $timeout)) {			
        	return false;
    	
		} else {
		
			fwrite($this->connection, "ver\n");
			if (!is_resource($this->connection)) 
				return false;
			do {
				$cmd = fgets($this->connection);
				$hcmd .= $cmd;
			} while ($cmd != "OK\r\n");

		return $hcmd;
		
		}
	}

geht einwandfrei. Ich erhalte eine entsprechende Ausgabe, und das Script findet das Ende. Nun die neue Version.


Auszug aus dem Terminal Client mit Verbindung zum Teamspeak 3 Server:

Code:
TS3
version
version=3.0.0-alpha4-pre-2 build=9068 platform=Linux
error id=0 msg=ok


PHP:
function connect($ip, $tcp, $timeout = 3) {
		
		$this->__construct();
    	
		if(!$this->connection = @fsockopen($ip, $tcp, $errno, $errstr, $timeout)) {			
        	return false;
    	
		} else {
		
			fwrite($this->connection, "version\n");
			if (!is_resource($this->connection)) 
				return false;
			do {
				$cmd = fgets($this->connection);
				$hcmd .= $cmd;
			} while ($cmd != "error id=0 msg=ok\r\n");

		return $hcmd;
		
		}
	}

In dieser Form findet er nicht das Ende und lädt sich zu Tode. Jedoch funktioiert das Auslesen einer einzelnen Zeile in Form von

PHP:
function connect($ip, $tcp, $timeout = 3) {
		
		$this->__construct();
    	
		if(!$this->connection = @fsockopen($ip, $tcp, $errno, $errstr, $timeout)) {			
        	return false;
    	
		} else {
		
			fwrite($this->connection, "version\n");
			if (!is_resource($this->connection)) 
				return false;

				$cmd = fgets($this->connection);

		return $cmd ;
		
		}
	}

sehr gut.

Daraus lässt sich meiner Ansicht nach schliessen, dass der Fehler in der Zeile

PHP:
} while ($cmd != "error id=0 msg=ok\r\n");

liegt. Und an dieser hab ich auch schon Stunden rumgebastelt und nach alternativen Lösungen gegooglet. Doch leider nicht fündig geworden.

Ich hoffe das jemad von euch eine Idee hat =)


Vielen Dank im Vorraus für das Lesen.


lG Flo
 
würde auch entweder zu feof raten oder
zu einem ganz banalen
PHP:
while(strpos($cmd, "error id=0 msg=ok") === false)
 
Vielen Dank für die schnellen Antworten.


Ich hab alle eure Lösungsvorschläge soeben mal ausprobiert.

Insbesondere

Sicher das \r\n am Ende steht?

Vielleicht nur \n?
Oder nichts?

hatte ich auch schon vorher mehre Male in verschiedensten Variationen ausprobiert.


Was mich sehr wundert ist, dass der Lösungsvorschlag

PHP:
while(strpos($cmd, "error id=0 msg=ok") === false)

wirklich funktioniert. Was mich auch seehr freut. Aber so wissbegierig wie ich immer bin, würde ich dann doch ganz gerne wissen warum er das Ende der Zeile nicht mit "\r\n" oder eben "\n\" findet.

Da ich vorher auch schon mit "substr" experimentiert hatte, habe ich mit den String Vergleichsfunktionen gar nicht weiter versucht.


Aber ich möchte mich recht herzlich bei euch bedanken, da mir das doch einiges an Zeit geraubt hat ;) Wer weiß, warum mein erster Versuch nicht geklappt hat, kann mich gerne schlauer machen =)


lG Flo
 
PHP:
while(strpos($cmd, "error id=0 msg=ok") === false)

Schaut ob der Text überhaupt vorhanden ist.

Anschließend können folgende Möglichkeiten folgen:
  • \r
  • \n
  • \r\n
  • (nichts)

Ohne Anspruch auf Vollständigkeit würde ich nun schätzen, dass bei dir letzteres der Fall seien könnte.
 
Zurück