socket problem

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

  • socket problem

    Ich habe ein Problem mit einem PHP-Script von mir, das eine Datei eines fremden Servers auslesen soll. Das Problem ist die Rückgabe ist immer wieder anders obwohl sich die Datei nicht verändert. Ausserdem ist sie falsch.

    Woran könnte das liegen?

    Vielen Dank für die Antworten und Entschuldigt die Länge des Beitrags.

    Das Script:
    PHP-Code:
    $path "xxx.ch";

    $socket pfsockopen($path80$errornumber$errorstring);
    if(!
    $socket) {
       echo 
    "$errstr ($errno)<br/>\n";
       echo 
    $socket;
    }else{
     
    $ret "";
     
    fwrite($socket"GET [url]http://xxx.ch/c4[/url]  HTTP/1.1\r\nHost: yyy.ch\r\nUser-Agent: PHP\r\nCache-Control: max-age=0\r\nConnection: close\r\n\r\n");
     do{
      
    $ret .= fread($socket1);
     }while(!
    strpos($ret"\r\n\r\n"));

     if(!
    strpos($responseHeader"Transfer-Encoding: chunked")){
      while(!
    feof($socket)){
       
    $ret .= fgets($socket128);
      }
     }else{
      while(
    $chunk_length hexdec(fgets($socket))){
       
    $read_length 0;
       
    $chunks "";
       while(
    $read_length $chunk_length){
        
    $chunks .= fread($socket$chunk_length $read_length);
        
    $read_length strlen($chunks);
       }
       
    $ret.= $chunks;
       
    fgets($socket);
      }
     }
     echo 
    $ret;
     
    fclose($socket);

    Die Ausgabe sollte so aussehen:
    PHP-Code:
    Array (Array
    (
        [
    0] => Array
            (
                [
    0] => 0
                
    [1] => 0
                
    [2] => Array
                    (
                        [
    0] => 
                    )

                [
    3] => Array
                    (
                        [
    0] => 3
                    
    )

            )


    Sie sieht aber so aus:
    PHP-Code:
    60
    Array
    (
        [
    0] => Array
            (
                [
    0] => 0
                
    [1] => 0
                
    [2
    99
    ] => Array
                    (
                        [
    0] => 
                    )

                [
    3] => Array
                    (
                        [
    0] => 3
         
    21
               
    )

            )

    )

    oder so (es gibt noch einige andere Möglichkeiten):
    PHP-Code:
    6
    Array

    2
    (

    1
     
    1
     
    1
     
    1
     
    1
    [
    1
    0
    5
    ] => 
    6
    Array

    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    2
    (

    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
    [
    1
    0
    5
    ] => 
    1
    0
    1


    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
    [
    1
    1
    5
    ] => 
    1
    0
    1


    1
     
    1
     
    1
     
    ... 
    Zuletzt geändert von jmc; 29.07.2008, 19:52.

  • #2
    Warum nicht einfach mit file_get_contents()?

    Der GET Header ist sicherlich falsch
    Die Header werden mit \n getrennt und nicht mit \r\n
    Wir werden alle sterben

    Kommentar


    • #3
      Mit \n verändert sich nichts. file_get_contents() benutze ich nicht, weil ich eigentlich nachher noch mit POST Daten übergeben will. Das war nur ein Versuch ob es klappt.
      Warum ist GET falsch?

      Kommentar


      • #4
        1. Dann benutze doch cURL, Snoopy, die HTTP Funktionen, oder was auch immer..
        Ist doch fast alles einfacher als das HTTP zufuß abzubilden.
        Auch mit dem file_get_contents() kann man meines Wissens nach POST Requests senden.

        2. Was oder ob bei dem GET falsch ist, ist schwer zu sagen. weil du "URLs automatisch umwandeln" beim Posten nicht abgeschaltet hast(hattest).
        Das http:// und der Servername darf da nicht hin!!
        Dass das HTTP ist sagst du ja schon im Header und für den Server gibts den Host-Header.
        Zuletzt geändert von combie; 28.07.2008, 20:21.
        Wir werden alle sterben

        Kommentar


        • #5
          Hab jetzt das alles abzuändern versucht, aber an der Ausgabe ändert sich immer noch nichts.
          Wahrscheinlich mache ich es wirklich eher mit cURL, aber ich möchte trotzdem gerne wissen, was am momentanen Script falsch ist, bzw. warum diese Ausgabe entsteht.

          PHP-Code:
          $path "xxx.ch";

          $socket pfsockopen($path80$errornumber$errorstring);
          if(!
          $socket) {
             echo 
          "$errstr ($errno)<br/>\n";
             echo 
          $socket;
          }else{
           
          $ret "";
           
          fwrite($socket"GET /c4/index.php  HTTP/1.1\nHost: yyy.ch\nCache-Control: max-age=0\nConnection: close\n\n");
           do{
            
          $ret .= fread($socket1);
           }while(!
          strpos($ret"\n\n"));

           if(!
          strpos($ret"Transfer-Encoding: chunked")){
            while(!
          feof($socket)){
             
          $ret .= fgets($socket128);
            }
           }else{
            while(
          $chunk_length hexdec(fgets($socket))){
             
          $read_length 0;
             
          $chunks "";
             while(
          $read_length $chunk_length){
              
          $chunks .= fread($socket$chunk_length $read_length);
              
          $read_length strlen($chunks);
             }
             
          $ret.= $chunks;
             
          fgets($socket);
            }
           }
           echo 
          $ret;
           
          fclose($socket);

          EDIT:
          $responseHeader in $ret abgeändert
          Zuletzt geändert von jmc; 28.07.2008, 21:10.

          Kommentar


          • #6
            Welche Header sendet der Server?
            Wir werden alle sterben

            Kommentar


            • #7
              PHP-Code:
              HTTP/1.1 200 OK
              Date
              Mon28 Jul 2008 19:03:30 GMT
              Server
              Apache/2.2.3 (Debianmod_ssl/2.2.3 OpenSSL/0.9.8c
              X
              -Powered-ByPHP/5.2.6-0.dotdeb.1
              Connection
              close
              Transfer
              -Encodingchunked
              Content
              -Typetext/html 
              EDIT:

              Ich habs rausgefunden. Es lag an meiner ziemlich falschen Art und Weise die Chunks zusammenzusetzen. Der Code folgt noch, falls sich jemand dafür interessiert.
              Wie ich jetzt herausgefunden habe muss ich in meinem Fall bei den Chunks \n verwenden, beim Header jedoch \r\n.

              Edit 2:

              Habe mich zu früh gefreut. Ca. jedes 3. Mal stimmt die Ausgabe und dazwischen gibt es wieder komische lange Ausgaben, wie im obersten Beitrag.
              Zuletzt geändert von jmc; 28.07.2008, 21:24.

              Kommentar


              • #8
                http://de3.php.net/manual/de/functio...ked-decode.php
                Und überhaupt: http://de.php.net/manual/de/book.http.php
                Wir werden alle sterben

                Kommentar


                • #9
                  http_chunked_decode() steht mir leider nicht zur Verfügung.
                  An der Funktion für die Chunks liegt es trotzdem nicht, wie ich rausgefunden habe. Es lag an pfsockopen. Das war ein Versehen und keine Absicht. Mit fsockopen funktioniert es problemlos.
                  Warum es mit pfsockopen nicht geht weiss ich aber nicht genau.

                  EDIT:

                  Für die, welche die Funktion http_chunk_decode() noch gebrauchen können und sie nicht in PHP eingebunden haben, sowie den funktionierenden Code:
                  PHP-Code:
                  <?
                  error_reporting(E_ALL);

                  $path = "google.de";

                  $socket = fsockopen($path, 80, $errornumber, $errorstring);
                  if(!$socket) {
                   echo "$errstr ($errno)<br/>\r\n";
                  }else{
                   $ret = "";
                   fwrite($socket, "GET http://www.google.de/  HTTP/1.1\r\nHost: xxx.ch\r\nCache-Control: max-age=0\r\nConnection: close\r\n\r\n");
                   while(!feof($socket)){
                    $ret .= fgets($socket, 128);
                   }
                   $header = substr($ret, 0, strpos($ret, "\r\n\r\n"));
                   $ret = substr($ret, strpos($ret, "\r\n\r\n") + 4);
                   if(strpos($header, "Content-Encoding: deflate")){
                    $ret = gzinflate($ret);
                   }else if(strpos($header, "Content-Encoding: gzip")){
                    $ret = gzdecode($ret);
                   }
                   if(strpos($header, "Transfer-Encoding: chunked")){
                    $ret = http_chunked_decode($ret);
                   }
                   echo $header;
                   echo "\n\n\n\n\n";
                   echo $ret;
                   fclose($socket);
                  }

                  function http_chunked_decode($str){
                   $ret = "";
                   $nr = hexdec(substr($str, 0, strpos($str, "\r\n")));
                   while($nr){
                    $str = substr($str, 2 + strpos($str, "\r\n"));
                    $ret .= substr($str, 0, $nr);
                    $str = substr($str, $nr + 2);
                    $nr = hexdec(substr($str, 0, strpos($str, "\r\n")));
                   }
                   return $ret;
                  }

                  ?>
                  Zuletzt geändert von jmc; 29.07.2008, 00:11.

                  Kommentar


                  • #10
                    Kannst du deinen Eingangspost bitte einmal umbrechen und dieses Meter lange Array kürzen? Danke!

                    Kommentar


                    • #11
                      @TS
                      pfsockopen() öffnet persistente Verbindungen zum Server. Ich weiss nicht was es dann für einen Einfluss hat, wenn du dann im Request einen Connection Close mitschickst. Könnte mir vorstellen, dass das Probleme geben könnte
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar


                      • #12
                        Jop, ich weiss eigentlich was es ist (war ein Versehen), aber connection: close sollte afaik auch dort erlaubt sein.

                        Kommentar

                        Lädt...
                        X