PHP-Sockets sehr "beschränkt" ?
-
Hallo,
Folgender PHP Source code:
<?php if (isset($_POST['submit'])) { $host = "localhost"; $port = 9999; $timeout = 0; $sk = fsockopen($host,$port,$errnum,$errstr,$timeout) ; $text = $_POST['command']; if (!is_resource($sk)) { exit("connection fail: ".$errnum." ".$errstr) ; } else { fputs($sk, $text) ; $dati="" ; $dati.= fgets ($sk, 500); echo $dati; } fclose($sk) ; } ?>
Wenn man in die Form ein Wert schreibt und dann auf den Button "senden" klickt, sendet das PHP Script dem Server einen Befehl. Dieser Server ist in C geschrieben und antwortet mit folgendem:
send(c, "test\0", strlen("test\0"), 0);
Nun passiert folgendes:
Der Server bekommt vom PHP Script den gesendeten Wert (Ausgabe mit printf beim Server > funktioniert!)
Der Server sendet dem PHP Script test\0
Das PHP Script gibt dies NICHT aus, sondern liest im fgets Teil weiter und zwar die 500 Zeichen! Und das obwohl ich den String mit \0 terminiere bzw. auch der Versuch mit \n oder \t bringt keinen Erfolg!
Schreib ich fgets folgendermaßen um:
$dati.= fgets ($sk, 5);
Dann funktionierts und er liest nur die 5 Zeichen und gibt diese aus!
Problem:
Ich weiß nicht wie lang die Antwort des Servers ist! test\0 ist nur zum testen, normalerweise steht dort eine Variable! Wie soll ich eine Kommunikation aufbauen, wenn PHP fgets nicht im Stande ist \0, \n oder \t zu lesen und dann mit dem lesen abzubrechen?Danke für eure hilfe!
-
lies halt solange ein bis das endzeichen kommt und nicht bis 500 bytes gesendet wurden...
-
Shade Of Mine schrieb:
lies halt solange ein bis das endzeichen kommt und nicht bis 500 bytes gesendet wurden...
Öh hast du meinen Post gelesen?
\0 wird nicht reagiert
\n wird nicht reagiert
\t wird nicht reagiertWas soll denn das "Endzeichen" sein?
-
else { fputs($sk, $text) ; $dati="" ; while (!strpos($dati, '\0')) { $dati.= fgets ($sk, 5); } echo $dati; }
Funktioniert leider auch nicht
-
Lies' Dir doch einfach die php-Doku durch. Dort gibt es viele Beispiele:
<?php $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>
-
meagain schrieb:
Shade Of Mine schrieb:
lies halt solange ein bis das endzeichen kommt und nicht bis 500 bytes gesendet wurden...
Öh hast du meinen Post gelesen?
\0 wird nicht reagiert
\n wird nicht reagiert
\t wird nicht reagiertWas soll denn das "Endzeichen" sein?
Lies meinen Post nochmal. Du liest nie bis zu einem endzeichen, du liest 500 bytes oder bis der socket geschlossen wurde.
-
Shade Of Mine schrieb:
meagain schrieb:
Shade Of Mine schrieb:
lies halt solange ein bis das endzeichen kommt und nicht bis 500 bytes gesendet wurden...
Öh hast du meinen Post gelesen?
\0 wird nicht reagiert
\n wird nicht reagiert
\t wird nicht reagiertWas soll denn das "Endzeichen" sein?
Lies meinen Post nochmal. Du liest nie bis zu einem endzeichen, du liest 500 bytes oder bis der socket geschlossen wurde.
Doch.
Jedoch sollte fgets() laut PHP - Doku bis zu einem Zeichen wie
\0
\n
\t
lesen und dann aufhören?!
-
witte schrieb:
Lies' Dir doch einfach die php-Doku durch. Dort gibt es viele Beispiele:
<?php $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>
Wenn ich dein Beispiel verwende, also die while Schleife mit feof bekomme ich folgende Fehler
Warning: feof(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 57
Warning: fgets(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 59
Warning: feof(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 57
Warning: fgets(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 59
Warning: feof(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 57
Warning: fgets(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 59
Warning: feof(): supplied argument is not a valid stream resource in /opt/lampp/htdocs/sis/c.php on line 57
-
Mein Fehler!
Die Variable ftp hab ich mit sk verwechselt.
Aber es spielt keine Rolle! Auch wenn ich diesen Code Ausschnitt verwende, so hängt sich das PHP Script auf in der while Schleife!Wie schon vorher gesagt es terminiert einfach nicht, obwohl \0 mitgesendet wird!
-
Also erst einmal Danke an alle Hilfen von Euch!
Die Lösung bestand - hardcore - folgendermaßen:
send(c, "test\t\n\0", strlen("test\t\n\0"), 0);
Jetzt terminiert es, endlich im PHP Script