php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.04.2006, 10:25  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard Problem mit fsockopen und fgets

Hi,

ich habe das folgende Problem:
zur Zeit schreibe ich an einer Server-Client Anwendung.
Den Server schreibe ich in c#, was ganz gut geht.
Ich kann auch schon mit dem php Client auf den Server verbinden und wenn ich etwas in den Stream schreibe kann der Server das auch wieder lesen.
So weit so gut.
Da ich aber mit dem Client nicht nur Daten senden will, sondern das ganze mit Anfrage/Antwort lösen will, muss ich danach auch wieder Daten aus dem Stream lesen.
Und das ist mein Problem, irgendwie scheint Php das Ende des Streams nicht zu erkennen :S.

PHP-Code:
<?php
function connect() {
  echo 
"connecting...\n";
  
$sock =  fsockopen("127.0.0.1"10000);
  return 
$sock;
}

function 
send($fp$bytes) {
  echo 
"sending data...\n";
  
fputs($fp$bytes);
}

function 
receive($fp) {
  echo 
"receive data...\n";
  
$response "";
  
//socket_set_blocking($fp, false);
  
$response fgets($fp256);
  return 
$response;
}

$request = array("Request" => "GetStatus");
$sock connect();
$response request ($sock$request);
echo 
$response."\n";
?>
Wenn ich blocking aktiviere, dann bleibt er beim empfangen der Daten hängen, deaktiviere ich es, dann geht er einfach darüber hinweg ohne etwas zu lesen.
Wenn ich weniger Daten lese als im Stream sind, dann funktioniert es jedoch problemlos, setze ich einen höheren Wert als die Länge des Streams, dann passiert was ich oben schon beschrieben habe.
Hoffe ihr könnt mir hierbei helfen

Gruß Flo
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.04.2006, 11:57  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Du könntest mal stream_get_contents() statt fgets() testen.
xabbuh ist offline   Mit Zitat antworten
Alt 23.04.2006, 12:49  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Zitat:
Du könntest mal stream_get_contents() statt fgets() testen.
hat leider nichts gebracht...

Ich glaube langsam es liegt an meinem Server Code.
Kann ich einfach so in den Stream schreiben und mit dem Client das ganze wieder auslesen?

Das ist mein Server Code zum Senden des "Responses":
Code:
public void send(string str)
{
    // write response ...
    byte[] data = Encoding.ASCII.GetBytes(str);
    this.cstream.Write(data, 0, data.Length);
}
(dürfte denke ich auch für phpler zu verstehen sein :P )
Wenn ich nach dem Senden der Antwort die Verbindung schließe, dann klappt es und der Client liest die Daten aus dem Stream.
Allerdings möchte ich die Verbindung beibehalten, da sich der Client zuerst bei dem Server authentifizieren sollte und ich nicht Login und Passwort bei jeder Anfrage erneut senden will...
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 23.04.2006, 14:29  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von FloMX
Zitat:
Du könntest mal stream_get_contents() statt fgets() testen.
hat leider nichts gebracht...
http://de3.php.net/manual/en/function.fread.php
Zitat:
fread() reads up to length bytes from the file pointer referenced by handle.
Reading stops [...] (for network streams) when a packet becomes available.
  Mit Zitat antworten
Alt 23.04.2006, 20:20  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Zitat:
Zitat von karl-150
Zitat:
Zitat von FloMX
Zitat:
Du könntest mal stream_get_contents() statt fgets() testen.
hat leider nichts gebracht...
http://de3.php.net/manual/en/function.fread.php
Zitat:
fread() reads up to length bytes from the file pointer referenced by handle.
Reading stops [...] (for network streams) when a packet becomes available.
Ah, danke, da liegt der Hase im Pfeffer
Hat jemand eine Ahnung wie man das Lösen könnte?
Die Ansätze auf der Seite funktionieren nicht..
habe auch schon sämtliche sock_x() funktionen ausprobiert, langsam weicht meine Hoffnung dem Verzweifeln...
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 23.04.2006, 21:13  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von FloMX
Hat jemand eine Ahnung wie man das Lösen könnte?
Zitat:
Reading stops [...] (for network streams) when a packet becomes available.
Genau das sollte doch zutreffen, wenn Du Daten mit fgets() etc. einlesen
kannst. Nur das diese Funktion erst beim Erreichen des Datei- bzw.
Zeilenendes "aufgibt". Wenn Du die Verbindung aufrecht erhälst, sollte
das also so nichts werden.

Ein einfaches fread($fp, 4711) hingegen sollte es meiner Meinung nach tun.

Wie sieht denn genau Dein Skript / Ansatz aus, der hier gescheitert ist?
  Mit Zitat antworten
Alt 24.04.2006, 08:41  
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Das Problem liegt darin das der String im C Programm mit einer binären Null terminiert wird ... PHP bzw. die Funktion fread kennt keine binäre Null als Stringende sondern nur den Zeilenumbruch ... du must dem String vor der binären Null praktisch noch einen Zeilenumbruch "\n" mitgeben dann sollte es funktionieren.
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.
HStev ist offline   Mit Zitat antworten
Alt 24.04.2006, 18:14  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Danke erstmal für die Vorschläge, ich kann mir auch gut Vorstellen, dass das mit dem "\n" in die richtige Richtung geht, allerdings ist immer noch irgendetwas verkehrt :S.
Möglicherweise könnte der Fehler darin liegen, dass Encoding.ASCII.GetBytes(str + "\n"); das \n einzeln übersetzt (\ und n)?
Edit: nein, habs geprüft, das \n wird als zeichenumbruch übertragen...

hier ist mein Ansatz.
Client Code zu Empfang der Daten:
PHP-Code:
<?php
function receive($fp) {
  while (!
feof($fp)) {
    
$data .= fread($fp128);
  }
  return 
$data;
}
?>
Server Code zum Senden der Daten:
Code:
public void send(string str)
{
    // write response ...
    byte[] data = Encoding.ASCII.GetBytes(str + "\n");
    this.cstream.Write(data, 0, data.Length);
    this.cstream.Flush();
}
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 24.04.2006, 19:04  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von HStev
Das Problem liegt darin das der String im C Programm mit einer binären Null terminiert wird ...
Schön, dass dem in C so ist. Hier aber nicht von Interesse.

Zitat:
Zitat von HStev
PHP bzw. die Funktion fread kennt keine binäre Null als Stringende sondern nur den Zeilenumbruch ...
In PHP arbeitet man also mit "zeilenumbruchterminierten" Strings? Interessant...


Zitat:
Zitat von FloMX
while (!feof($fp)) {
feof() ist hier die falsche Lösung, da diese Funktion erst beim Timeout des
Sockets greift.

Zitat:
Zitat von [url
http://de2.php.net/feof[/url]]Returns TRUE if the file pointer is at EOF or an error occurs (including
socket timeout
); otherwise returns FALSE.
Wenn Dir mein obiger Vorschlag nicht gefällt / wieso auch immer nicht
funktionieren sollte, kann Dir eventuell socket_select() in Verbindung
mit socket_set_timeout() weiterhelfen.

http://php.net/socket_select
http://php.net/socket_set_timeout
  Mit Zitat antworten
Alt 24.04.2006, 19:18  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Zitat:
Schön, dass das in C so läuft. Hier aber nicht von Interesse.
Dein Kommentar ist auch nicht von Interesse.

Zitat:
Wenn Dir mein obiger Vorschlag nicht gefällt / wieso auch immer nicht
funktionieren sollte, kann Dir eventuell socket_select() in Verbindung
mit socket_set_timeout() weiterhelfen.
Mit socket_set_timeout() wäre es mit Sicherheit möglich, allerdings finde ich die Lösung etwas zu unsicher...

Ich hab es gerade geschafft eine Lösung zu finden, juhu

Senden der Daten:
Code:
public void send(string str)
{
    // write response ...
    byte[] data = Encoding.ASCII.GetBytes(str + "\r\n");
    this.cstream.Write(data, 0, data.Length);
    this.cstream.Flush();
}
Empfang der Daten:
Code:
<?php
function receive($fp) {
  while(substr($data, strlen($data) - 2) != "\r\n") {
    $data .= fread($fp, 1024);
  }
  return $data;
}
?>
(der bb php tag ist irgendwie kaputt :S)
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zu fsockopen() Pennywise PHP Tipps 2008 2 27.07.2008 14:50
problem beim lesen mit fgets jogisarge PHP Tipps 2008 1 09.06.2008 18:29
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
fsockopen() - Problemdomains dragon1402 PHP Tipps 2006 9 30.08.2006 11:57
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
fsockopen() Problem - weis nicht mehr weiter :( web2 PHP Tipps 2005-2 22 21.10.2005 15:31
fsockopen problem PHP Tipps 2005-2 1 24.09.2005 21:41
php fsockopen fgets response check: 404 und 403 warum? ff-webdesigner.de PHP Tipps 2005 4 17.04.2005 14:06
[Erledigt] Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Problem mit Weiterleitung PHP Tipps 2004-2 16 22.12.2004 17:49
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34
Problem mit Länge des Rückgabestrings bei fsockopen PHP-Fortgeschrittene 1 06.08.2004 18:54

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
fgets encoding, fsockopen fgets, php fsockopen fgets hangs, fsockopen in c programmierung, fgets funktioniert nicht, fsockopen stream_get_contents, fsockopen bytes fgets, fsockopen blocking fgets not working, c# nullterminiert binär lesen, stream_get_contents hängt, php socket_set_timeout(), fsockopen fgets hängt, php fsockopen encoding, fgets encoding php, fsockopen c, php fsockopen stream_get_contents, fsockopen fgets c, php fsockopen 127.0.0.1 wont work, fgets response, php fsockopen fgets

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.