6 Stimmen

Herunterladen einer Datei aus dem Internet in C++ ohne Verwendung von Nicht-Standard-Bibliotheken unter Linux

Wenn ich von Nicht-Standard-Bibliotheken spreche, meine ich damit Dinge wie Boost, libCurl und alles andere, was dies viel einfacher machen kann als Standard-C++. Der Grund dafür ist, dass ich eine Anwendung als Kursarbeit schreibe (der Kurs ist C++ gewidmet) und ich muss nur Standardbibliotheken und -funktionen verwenden.

Ich bin auf der Suche nach einer RSS-Datei herunterladen, mit einer URL, die der Benutzer liefern wird (ich baue eine rudimentäre RSS-Client), und das größte Problem, das ich konfrontiert bin, ist, dass ich nicht sicher bin, wie die Datei nach unten zu bekommen. Sobald ich vorbei, dass Bit, Parsen es für die Xml-Tags und die Anzeige des Inhalts wird relativ einfach sein. Ich habe mich umgesehen und habe nur Lösungen gefunden, die sagen, dass nicht-Standard-Bibliotheken, in der Regel libCurl zu verwenden. Wenn jemand könnte nur geben Sie mir eine kurze Vorwarnung über was ich sollte für diese suchen, dann wäre ich dankbar.

Auch wenn Sie glauben, dass Sie mir beim Betrügen helfen, tun Sie das nicht. Die Aufgabe besteht darin, eine Anwendung unserer Wahl zu erstellen, und wir werden nach unserer Verwendung der verschiedenen Merkmale der Sprache benotet (sie muss so viele Klassen enthalten, diese Variablentypen verwenden usw.).

9voto

user229044 Punkte 220593

チェックする Beejs Anleitung zur Netzwerkprogrammierung für eine schnelle, aber ausgezeichnete Einführung in Steckdosen. Wenn Sie keine Nicht-Standard-Bibliotheken verwenden können, bleibt Ihnen nur die Möglichkeit, sich manuell über Port 80 zu verbinden und die Anfrage selbst zu stellen.

Wenn Sie auch nur über Grundkenntnisse in C++ verfügen, sollte das alles sein, was Sie brauchen.

9voto

Steve Jessop Punkte 264569

Erstens ist es nicht möglich, nur mit Standard-C++ zu arbeiten. Es gibt weder in Standard-C++ noch in Standard-C eine Netzwerkschnittstelle.

Wenn Sie einen "Do-it-yourself"-Ansatz wählen müssen, dann ist es wahrscheinlich beabsichtigt, dass Sie die Sockets-API Ihrer Plattform verwenden. Im Fall von Linux ist dies Teil des POSIX-Standards, nicht von C++, und ist verfügbar unter <sys/socket.h> .

Das grundlegende Verfahren ist: Parsen der URL; Nachschlagen der IP-Adresse der Domäne; Erstellen eines Sockets; Verbinden des Sockets; Schreiben einer HTTP-Anfrage an den Socket; Lesen der HTTP-Antwort vom Socket; Aufräumen.

Offensichtlich ist eine HTTP-Bibliothek weitaus praktischer, zumal ein HTTP-Download komplizierter werden kann als das, was ich oben beschrieben habe (zum Beispiel, wenn der Server mit einer Umleitung antwortet). So gut wie alle Linux-Distributionen bieten libcurl und/oder die curl y wget Programme.

3voto

Martin York Punkte 245363

Ein Programm zu schreiben, das eine Socket-Verbindung herstellt, ist relativ trivial.

http://www.linuxhowtos.org/C_C++/socket.htm

Nachdem Sie nun einen Socket zu einem HTTP-Server geöffnet haben, müssen Sie verstehen, wie Sie ein Dokument anfordern und die Antwort dekodieren können:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Im Grunde müssen Sie senden:

GET<SP><URL><SP>HTTP/1.1<CRLF>

Where:
  SP:    Single Space
  CRLF:  \r\n
  URL:   The Full URL of the page including the server name.

Was Sie zurückbekommen, ist

http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

HTTP/1.1<SP>200<SP>OK<CRLF>
(<Header><CRLF>)*
<CRLF>
<Document>

Die obigen Ausführungen bedeuten:

  • Die erste Zeile ist die Antwortzeile, die 200 OK enthalten sollte.
    • Wenn dies nicht der Fall ist, liegt ein Fehler vor und Sie sollten aufgeben.
  • Es folgen 0 oder mehr Kopfzeilen
    • Ignorieren Sie einfach diese Zeilen
  • Das Ende der Kopfzeilen wird durch eine Leerzeile markiert.
  • Dann wird das Dokument in den Stream gestellt.

2voto

Flexo Punkte 84571

Wenn Sie es wirklich tun wollen, ohne libcurl zu verwenden, können Sie immer einen TCP-Socket öffnen und dann senden:

GET /myurl 

(http 1.0 oder verwenden Sie vorzugsweise http 1.1 )

Im Grunde schreiben Sie eine sehr einfache http-Protokoll-Client-Implementierung.

0voto

Dewfy Punkte 22558

Sie können den Quellcode für wget Standarddienstprogramm

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X