Vor kurzem habe ich diesen Leitfaden genommen, um mich mit dem Herunterladen von Dateien aus dem Internet vertraut zu machen. Ich las es und kam mit dem folgenden Code, um den HTTP-Körper einer Website herunterzuladen. Das einzige Problem ist, es funktioniert nicht. Der Code stoppt beim Aufruf des recv () -Aufrufs. Es stürzt nicht ab, es läuft einfach weiter. Ist das meine Schuld? Benutze ich den falschen Ansatz? Ich beabsichtige, den Code zu verwenden, um nicht nur den Inhalt von .html-Dateien herunterzuladen, sondern auch andere Dateien herunterzuladen (zip, png, jpg, dmg ...). Ich hoffe, es gibt jemanden, der mir helfen kann. Das ist mein Code:
%Vor%Wenn Sie Dateien über HTTP abrufen möchten, ist libcURL wahrscheinlich Ihre beste Option in C. Wenn Sie es sind Wenn Sie dies als eine Möglichkeit zum Erlernen der Netzwerkprogrammierung verwenden, müssen Sie etwas mehr über HTTP lernen, bevor Sie eine Datei abrufen können.
Was Sie in Ihrem aktuellen Programm sehen, ist, dass Sie eine explizite Anfrage für die Datei senden müssen, bevor Sie sie abrufen können. Ich würde damit beginnen, RFC2616 zu lesen. Versuchen Sie nicht, alles zu verstehen - es ist eine Menge zu lesen für dieses Beispiel. Lesen Sie den ersten Abschnitt , um zu erfahren, wie HTTP funktioniert, und lesen Sie dann die Abschnitte 4, 5 und 6 , um das grundlegende Nachrichtenformat zu verstehen.
Hier ist ein Beispiel dafür, wie eine HTTP-Anfrage für die Stackoverflow-Fragenseite aussieht:
%Vor% Ich glaube, das ist eine minimale Anfrage. Ich fügte die CRLFs explizit hinzu, um zu zeigen, dass eine Leerzeile verwendet wird, um den Anforderungsheaderblock wie in RFC2616 beschrieben zu beenden >. Wenn Sie den Accept-Encoding
Header weglassen, wird das Ergebnisdokument wahrscheinlich als gzip- komprimierter Stream, da HTTP dies explizit zulässt, wenn Sie dem Server nicht mitteilen, dass Sie ihn nicht möchten.
Die Serverantwort enthält auch HTTP-Header für die Metadaten, die die Antwort beschreiben. Hier ist ein Beispiel für eine Antwort von der vorherigen Anfrage:
%Vor%Dieses einfache Beispiel soll Ihnen eine Idee geben, was Sie bei der Implementierung von Dateien mit HTTP erreichen möchten. Dies ist der beste Fall, das einfachste Beispiel. Dies ist nichts, was ich leichtfertig tun würde, aber es ist wahrscheinlich der beste Weg, HTTP zu lernen und zu schätzen.
Wenn Sie nach einer einfachen Möglichkeit suchen, Netzwerkprogrammierung zu lernen, ist dies ein guter Anfang. Ich würde empfehlen, eine Kopie von TCP / IP Illustrated, Band 1 und UNIX Network Programming, Band 1 . Dies ist wahrscheinlich der beste Weg, wirklich zu lernen, wie man netzwerkbasierte Anwendungen schreibt. Ich würde wahrscheinlich mit dem Schreiben eines FTP-Clients beginnen, da FTP ist ein viel einfacheres Protokoll für den Anfang.
Wenn Sie versuchen, die mit HTTP verbundenen Details zu erfahren, dann:
telnet server 80
aus und geben Sie Anfragen manuell ein --verbose
und --include
, damit Sie sehen können, was passiert Planen Sie nicht, Ihren eigenen HTTP-Client für die Unternehmensnutzung zu schreiben. Du willst das nicht tun, vertraue mir als jemand, der seit einer Weile einen solchen Fehler aufrechterhält ...
Das Problem ist, dass Sie das HTTP-Protokoll implementieren müssen. Beim Herunterladen einer Datei müssen Sie nicht nur eine Verbindung zum Server herstellen, sondern Sie müssen HTTP-Anforderungen (zusammen mit dem richtigen HTTP-Header) senden, bevor Sie eine Antwort erhalten. Danach müssen Sie die zurückgegebenen Daten noch analysieren, um weitere HTTP-Header zu entfernen.
Wenn Sie nur versuchen, Dateien mit C herunterzuladen, empfehle ich Ihnen die cURL-Bibliothek , die die HTTP-Funktion für Sie übernimmt.