Leere Zeilen bei Socket-Verbindung

steyrblade

Mitglied
Hallo
ich habe gerade ein Problem mit einer Socket-Verbindung.
Ich bekomme immer eine unterschiedliche Anzahl von leeren
Zeilen (die nicht vorhanden sind), vor und nach den eigentlichen Daten die ich einlesen möchte.



URL und Port logischerweise mit gesendet.

PHP:
$url  = "http://xyz.com/asci_ausgabe.html";
$port ="7779";

function verbindung($url,$port)
{
       
        error_reporting(0);
        $url = str_replace("http://","",$url);
        $urlComponents = explode("/",$url);
        $domain = $urlComponents[0];
        $resourcePath = str_replace($domain,"",$url);
        $socketConnection = fsockopen($domain, $port, $errno, $errstr);

        if (!$socketConnection)
        {
                return 0;
        }
        else
        {
                $data = '';
               
                @fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n");
                while (!feof($socketConnection))
                {                      
                        $data[] =fgets($socketConnection); 
                }
                fclose ($socketConnection);
                return($data);
                
        }
}


Als Ausgabe bekomme ich dann z.B. :
Ausgabe von $data:
Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] =>
[9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] =>
[18] => [19] => [20] => [21] => [22] => [23] => [24] => [25] => [26]
=> [27] => [28] => [29] => [30] => [31] => [32] => [33] => [34] =>
[35] => [36] => [37] => [38] => [39] => [40] => [41] => [42] => [43]
=> [44] => [45] => [46] => [47] => [48] => [49] => [50] => [51] =>
[52] => [53] => [54] => [55] => [56] => [57] => [58] => [59] => [60]
=> [61] => [62] => [63] => [64] => [65] => [66] => [67] => [68] =>
[69] => [70] => [71] => [72] => [73] => [74] => [75] => [76] => [77]
=> [78] => [79] => [80] => [81] => [82] => [83] => [84] => [85] =>
[86] => [87] => [88] => [89] => [90] => [91] => [92] => [93] => [94]
=> [95] => [96] => [97] => [98] => [99] => [100] => [101] => [102] =>
[103] => [104] => [105] => [106] => [107] => [108] => [109] =>
[110]
=> HTTP/1.1 200 OK [111] => Date: Mon, 27 Apr 2009 14:34:03 GMT [112]
=> Server: Apache/2.2.3 (CentOS) [113] => Last-Modified: Mon, 27 Apr
2009 14:24:51 GMT [114] => ETag: "561a4f-21b4-1bfa32c0"
...

Leerzeilen kommen oft auch am Ende vor.

Kann mir da jemand weiterhelfen?

Danke schon mal
 
Warum versucht du eine url mit einem port zu öffnen.
Normaleweiße nutzt du nur den port um daten an einen server zu senden. BZW um daten von einem server auszulesen.
 
Endet Deine Variable $resourcePath mit einem Leerzeichen?
Ansonsten muss naemlich hier
PHP:
@fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n");
ein Leerzeichen rein.
Also so:
PHP:
@fputs($socketConnection, "GET $resourcePath HTTP/1.0\r\nHost:$domain\r\n\r\n");

Zudem solltest Du $data nicht als String initialisieren wenn Du es anschliessend als Array verwendest.

Also entweder so:
PHP:
                $data = ''; 
                
                @fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n"); 
                while (!feof($socketConnection)) 
                {                       
                        $data.=fgets($socketConnection);  
                }
oder so
PHP:
                $data = array(); 
                
                @fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n"); 
                while (!feof($socketConnection)) 
                {                       
                        $data[] =fgets($socketConnection);  
                }
aber nicht so
PHP:
                $data = ''; 
                
                @fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n"); 
                while (!feof($socketConnection)) 
                {                       
                        $data[] =fgets($socketConnection);  
                }

Ansonsten: Was spricht gegen HTTP/1.1? ;)

Allgemein: Kannst Dir ja auch einfach mal meine HTTP-Klasse anschauen (Link siehe Signatur).

Gruen: Frosch, Foerster, Polizei... ;)
 
Ansonsten: Was spricht gegen HTTP/1.1?
Was ist denn der unterschied zu 1.0.

Bei dem Array geb ich dir Recht. Aber das macht ja normalerweise keine Probleme.
Vllt muss er dann die Speicherbelegung umstellen aber sonst?
PHP ist da ja wesentlich intelligenter als JAVA ;-)

Hab das eigentlich nur als reset drin, da der ganze block nochmal in ner for Schleife ist. Ich werde am Montag mal testen
 
Wie lang sind die Werte die da am Anfang Deines Arrays stehen?
Falls die Laenge 0 ist, also einfach nichts gelesen wird dann wuerde ich sagen dass das Problem dadurch behoben werden kann indem Du in einen String liest anstatt in ein Array, was meiner Meinung nach eh sinnvoller ist.

Ich hab jetzt bei mir nie wirklich geschaut ob sowas auch bei mir passiert, da ich in einen String lese anstatt in ein Array, koennte das aber bei Bedarf mal testen.

Wenn Du aber keine leeren Antworten kriegst (also die Laenge des Strings > 0 ist) dann sollten wir mal weiterschauen was denn da nun gebacken ist.

Ansonsten koenntest Du auch mal mit einem Programm wie z.B. Wireshark schauen ob da wirklich "ein Haufen nix" uebertragen wird, aber ich denk mal eher nicht.
Ich koennte mir hier eher vorstellen dass das Problem ist dass PHP eben anfaengt zu lesen, aber noch nix zurueckkommt, aber eben auch kein EOF, sodass eben PHP weiterhin liest bis der Server nun auch wirklich seine Antwort und das anschliessende EOF sendet.
 
$data = array(); hab ich eingetragen (wie vermutet keine Änderung)
strlen der nicht gewollten leeren Zeilen ist 0

Für was wird denn eigentlich das fputs bzw. fwrite benötigt.
Muss man unbedingt einen header mitschicken und wofür steht das \r \n
ohne diese Zeile sehe ich keinen Unterschied.

\r = read?
\n = Zeilenumbruch?


Danke für die bisherige Hilfe.
 
Würde das so richtig übelst Primitiv nicht helfen!?

PHP:
                $data = array(); 
                
                @fputs($socketConnection, "GET $resourcePathHTTP/1.0\r\nHost:$domain\r\n\r\n"); 
                while (!feof($socketConnection)) 
                {                       
                      if( fgets($socketConnection) != "")
                         {
                             $data[] =fgets($socketConnection);  
                         }
                }

ist zwar richtig dreckig aber und unschön aber sollte evtl. die leeren einträge verhindern.
 
Ich denke das wuerde nicht wirklich helfen.
Problem ist ja das bei jedem fgets() gelesen wird.
Wenn nun also das Resultat von fgets() nicht leer ist wird wieder gelesen, aber eben was anderes als zuvor. Der zuvor gelesene Wert verschwindet im Nirwana und geht eben nicht in den Array.

Entsprechend ist diese Loesung nicht gerade praktisch.
Wie gesagt, wenn wirklich leere Strings gelesen werden reicht es in einen String zu lesen anstatt in ein Array, denn dann kriegt man von den leeren Strings ja nichts mit.

Und warum der Fragesteller ein Array habe ich ja schon in meinem letzten Post hinterfragt. Ich persoenlich finde diese Herangehensweise naemlich recht unpraktisch wenn es dann an die Auswertung der Antwort vom Server geht.
 
Zurück