RFZ: PHP Socket Problem....

Moin, ich hab ein Dickes Problem...
Ich Bau via Socket eine Verbindung zu nem Webserver auf (funktion unten) und bekomme dann ab und zu kleine Fehler in dem empfangenen Text. z.B. aus 'nicht' wird 'nich1000t' oder aus 'das' wird 'daa2as'. Versteht sich von selbst dass ich solche Fehler nicht brauchen kann, warscheinlich is eh schon ein grosser Teil meiner Datenbank versaut. Also, bitte helf mir :)

Funktion:

function readurl($url)
{
$url = eregi_replace("http://","",$url);
$do_be = @strpos($url,"/");
$server = substr($url,0,$do_be);
$document = substr($url,$do_be);
$port=80;
if(strlen($document) > 0) {
$fp = @fsockopen ("$server", $port, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
$header = <<<header
GET $document HTTP/1.1
Accept: */*
Accept-Language: de
User-Agent: Test-Script (by RFZ)
Host: $server
Connection: Close

header;
    fputs ($fp, $header);
    while (!feof($fp)) {
        $body = $body. fgets ($fp,128);
    }
    fclose ($fp);
}
}
if(substr($body,0,12) !="HTTP/1.1 200") $body = false;
$head_end = strpos($body,"\r\n\n") + 3;
$body = substr($body,$head_end);
return $body;
}

cu RFZ

  1. Nochwas, anscheinend tritt der Fehler nur auf wenn ich die URL das erste mal öffne. Ausserdem scheint dann am Anfang (nach dem Head) immer 'ef6' zu stehen...

    cu RFZ

  2. Hallo,

    Ich Bau via Socket eine Verbindung zu nem Webserver auf (funktion unten)

    Warum benutzt du nicht den fopen()-Wrapper?

    $fd = fopen('http://url/','r');
    if(!$fd) die("error!");
    $str = '';
    while($line = fread($fd,512)) {
      $str .= $line;
    }

    function readurl($url)
    {
    $url = eregi_replace("http://","",$url);

    besser preg_replace()

    $do_be = @strpos($url,"/");
    $server = substr($url,0,$do_be);
    $document = substr($url,$do_be);
    $port=80;

    Was, wenn der Port nicht 80 ist?

    $header = <<<header
    GET $document HTTP/1.1
    Accept: */*

    Den Header wuerde ich eher weglassen wollen als */* zu schicken.

    Accept-Language: de
    User-Agent: Test-Script (by RFZ)
    Host: $server
    Connection: Close

    header;

    Hier ist ein Newline zu viel. Nur eine Leerzeile!

    while (!feof($fp)) {
            $body = $body. fgets ($fp,128);

    Nimm fread() statt fgets(). Nicht jede Zeile hat Zeilenenden...

    if(substr($body,0,12) !="HTTP/1.1 200") $body = false;

    Was ist bei einer 1.0-Antwort? Kann passieren, aus verschiedensten Gruenden. Ein Fall fuer
    preg_match()...

    $head_end = strpos($body,"\r\n\n") + 3;

    du meinst IMHO strpos($body,"\015\012\015\012") + 4;

    Gruesse,
     CK

    1. Moin, danke für die Antwort. Die möglichen Fehler bei um die URL zu teilen, oder eine korrekte Antwort zu bestimmen sind mal egal, ausserdem hab ich bisher nur einen Server im Auge und weiss daher was er antwortet...
      Das mit fgets() und fread() werd ich aber mal probieren.
      fopen() kann ich nicht verwenden, da ich gern einen eigenen Header senden möchte (manchmal sogar muss, wegen cookies).

      cu RFZ

    2. So, mit fread() hab ich leider das selbe Ergebnis :(
      fopen() funktioniert ist aber auf dauer keine Lösung....

      cu RFZ