fsockopen() UDP Empfangspuffer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • fsockopen() UDP Empfangspuffer

    Hi,

    Nach einer UDP Abfrage erhalte ich keine vollständige Antwort. Zum Beispiel empfange ich ab 1390 Bytes nach einem chr(0) byte nichts mehr. Obwohl weitere Daten gesendet werden sollten.

    Hier mal der vereinfachte Code:
    Code:
    $fp = fsockopen("udp://$ip", $port, $errno, $errstr, $udp_timeout);
    @socket_set_timeout($fp, $udp_timeout);
    fwrite($fp, $befehl);
    $antwort = fread($fp, 1);
    $socket_status = socket_get_status($fp);
    $bytes = $socket_status['unread_bytes'];
    $antwort .= fread($fp, $bytes);
    Also ich erhalte bis zu 1391 Bytes. Lese ich ein Byte mehr gibt es einen Timeout. Hat PHP vielleicht eine Begrenzung, die nicht mehr als 2KB im Eingangspuffer zulässt? Wie umgehe ich diese Grenze?

  • #2
    hmmm



    hast du schon mal mit dem Block-Modus gespielt sprich ausprobiert? -> http://www.php.net/manual/de/functio...t-blocking.php

    und was gibt den socket_get_status() noch für Infos zurück beim Abbruch?

    Kommentar


    • #3
      Danke für den Tip!

      Ich habe es auf deinen Hinweis nochmal mit socket_set_blocking() probiert. Nach 4 Stunden hat es dann doch so hingehauen, wie es sollte.

      Das Problem war, dass die Daten in mehreren getrennten Paketen geliefert werden. Die Scheinbar immer < 2KB sind. Also lese ich erstmal die ganzen Daten ($socket_status['unread_bytes']) ein. Dann um timeout zu vermeiden blocking auf 0. 1 Byte lesen und blocking wieder auf 1. Ist das Byte gleich dem Anfang des ersten Daten-Packets, lese ich wieder den Puffer aus. Wenn nicht -> Ende. Die Prüfung ist in diesem Fall sehr simpel wenn Byte == chr(255). Das ganze in ne while Schleife und fertig. Klapp wunderbar danke für den Denkanstoss .

      Hier der erweiterte Code, wenns jemanden interessiert:
      Code:
      $fp = fsockopen("udp://$ip", $port, $errno, $errstr, $udp_timeout);
      @socket_set_timeout($fp, $udp_timeout);
      fwrite($fp, $befehl);
      $test = $byte = fread($fp, 1);
      while($test == chr(255)) {
      	$socket_status = socket_get_status($fp);
      	$antwort .= $test;
      //	echo "($test) - ".ord($test)." - ".$socket_status['unread_bytes']."\n";
      	while($socket_status['unread_bytes'] > 0) {
      		$count++;
      		$antwort .= $byte = fread($fp, 1);
      		$socket_status = socket_get_status($fp);
      //		echo "($byte) - ".ord($byte)." - ".$socket_status['unread_bytes']."\n";
      	}
      	socket_set_blocking($fp, 0);
      	$test = fread($fp, 1);
      	socket_set_blocking($fp, 1);
      }
      Kennst du dich vielleicht ein klein wenig mit Perl aus? Dann kannst du mir vielleicht einen Tipp geben? Denn auf diesen Tread antwortet leider niemand. Und ich nehm euch nicht ab, dass Keiner auch nur eine Idee hat

      Kommentar


      • #4
        sorry, nein, zu deinem Perl-Thema kann ich dir leider nicht weiterhelfen. Kenne mich mit Perl so gut wie gar nicht aus.

        Kommentar

        Lädt...
        X