socket problem

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
     
    ... 
    Last edited by jmc; 29-07-2008, 18: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

    Comment


    • #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?

      Comment


      • #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.
        Last edited by combie; 28-07-2008, 19:21.
        Wir werden alle sterben

        Comment


        • #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
          Last edited by jmc; 28-07-2008, 20:10.

          Comment


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

            Comment


            • #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.
              Last edited by jmc; 28-07-2008, 20:24.

              Comment


              • #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

                Comment


                • #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;
                  }

                  ?>
                  Last edited by jmc; 28-07-2008, 23:11.

                  Comment


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

                    Comment


                    • #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)

                      Comment


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

                        Comment

                        Working...
                        X