Socket=>empfangen/verarbeiten der Dateien
Trottel
- php
tach,
bei meiner funktion SOLLTE von nem server eine datei via fsock (nicht fopen o.ä.) empfangen werden. allerdings stimmt wohl irgendwas nicht ganz, sodass HTTP/1.1 200 OK als rückgabewert erfolgt. stattdessen sollte da die datei angezeigt werden...
<?
$fp = fsockopen ("localhost", 80, $errno, $errstr, 30);
echo(file_("http://localhost/index.html",$fp));
function file_($link, $fp)
{
preg_match("#http://([^/]*?)/(.*)#s",$link,$ar);
$link=$ar[2]; echo "<br>-$link-<br>";
$method = "GET";
$request = "$method /$link HTTP/1.1\r\n";
$request .= "Host: $ar[1]\n";
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
$request .= 'Accept: text/xml,application/xml,application/xhtml+xml,';
$request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$request .= "Accept-Language: en-us, en;q=0.50\r\n";
$request .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n";
$request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
$request .= "Keep-Alive: 300\r\n";
$request .= "Connection: keep-alive\r\n";
$request .= "Referer: $referer\r\n";
$request .= "Cache-Control: max-age=0\r\n";
$request .= "\r\n";
fputs( $fp, $request );
$src=fgets ($fp, 1000);
return($src);
}
fclose($fp);
?>
was is falsch?
bzw wie is es richtig zu machen?
danke
bei meiner funktion SOLLTE von nem server eine datei via fsock (nicht fopen o.ä.) empfangen werden. allerdings stimmt wohl irgendwas nicht ganz, sodass HTTP/1.1 200 OK als rückgabewert erfolgt. stattdessen sollte da die datei angezeigt werden...
$method = "GET";
$request = "$method /$link HTTP/1.1\r\n";
$request .= "Host: $ar[1]\n";
Ab hier kannst Du den kompletten Rhabarber löschen, wenn Du ihn nicht wirklich unbedingt dringenst nötig hast.
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
[..]
fputs( $fp, $request );
$src=fgets ($fp, 1000);
was is falsch?
Der Server antwortet Dir (fast) genauso, wie Du in befragt hast: Mit einem Kopf- und einem Datenteil, getrennt durch eine Leerzeile. Du liest im Moment nur die erste Zeile der kompletten Antwort ein, dadurch geht Dir zum einen natürlich der gesamte Rest verloren und zum zweiten düftest Du Dich hier und da über den wundersamen Schwanzabschneider wundern - fgets() hört grundsätzlich bei einer Zeilenschaltung auf, und davon gibt es wahrlich viele, sowohl in Text- als auch in Binärdaten.
Benutze fgets() für die Kopfzeilen, d.h. bis fgets() eine leere Zeile liefert, anschließend fread() (oder sowas in der Art, will jetzt nicht in die Anleitung schauen), bis Content-Length: oder, falls der Server diese Angabe nicht sendet, das "Dateiende" erreicht ist.
Gruß,
soenk.e