Wie machen Sie eine HTTP-get-request in C ohne libcurl?
Ich will schreiben Sie ein C-Programm zum generieren einer Get-Anforderung ohne Verwendung externer Bibliotheken. Ist das möglich, nur mithilfe von C-Bibliotheken mit Hilfe von sockets ? Ich überlege, wie man eine http-Paket(mit der richtigen Formatierung) und sendet es an den server. Ist das die einzige Möglichkeit oder gibt es eine bessere Möglichkeit ?
- Nein. Sie müssen lernen, die BSD-socket API zuerst, dann manuell pack zusammen alle raw-Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von BSD-sockets oder, wenn Sie etwas begrenzt, sagen Sie, Sie haben einige RTOS, einige einfacher TCP-stack, wie iwip, können Sie die GET/POST-Anfrage.
Gibt es eine Reihe von open-source-Implementierungen. Siehe die "happyhttp" als sample ( http://scumways.com/happyhttp/happyhttp.html ). Ich weiß, es ist C++, nicht in C, aber das einzige, was ist "C++-abhängiger" es ist ein string/array-management, so ist es leicht portiert Reine C.
Vorsicht, es gibt keine "Pakete", da HTTP in der Regel übertragen über die TCP-Verbindung, also technisch gibt es nur einen Strom von Symbolen in der RFC-format. Da http-Anfragen werden in der Regel in einem verbinden-senden-trennen Sie Weise, könnte man tatsächlich nennen das ein "packet".
Grundsätzlich einmal haben Sie einen offenen socket (sockfd), "alle", die Sie zu tun haben, ist so etwas wie
POSIX-7 minimal lauffähigen Beispiel
Let ' s Holen http://example.com.
wget.c
GitHub upstream.
Kompilieren:
Bekommen http://example.com und Ausgabe auf stdout:
Dieser Befehl hängt für die meisten Server bis zum timeout, und das wird erwartet:
Content-Length
wird nicht gesendet, der server kann nur in der Nähe, um zu bestimmen, die Länge.
Die Verbindung Teil funktioniert auch mit der IP:
gibt:
und wir tun so:
jedoch, die Antwort ist ein Fehler, denn wir sind nicht die Einstellung der
Host:
richtig in unserem Programm, und das ist benötigt HTTP 1.1.Getestet auf Ubuntu 18.04.
Server Beispiele
read(socket_file_descriptor, buffer, BUFSIZ)
.Content-Length:
im Fall von HTTP, aber ich wollte nicht, dass das Parsen von HTTP-in diesem einfachen Beispiel."Ohne externe Bibliotheken" streng genommen ausschließen würde, libc, so müsste man schreiben, die alle Aufrufe selbst. Ich bezweifle, dass Sie es bedeuten, dass eine strenge, aber. Wenn Sie nicht wollen, um einen link zu einer anderen Bibliothek, und nicht zu kopierenden Quell-code aus einer anderen Bibliothek in Ihre Anwendung, dann direkt den Umgang mit den TCP-stream mit dem socket-API ist Ihre beste Ansatz.
Erstellen der HTTP Anfrage und senden es über eine Die TCP-socket-Verbindung ist einfach, wie das Lesen der Antwort. Es ist das Parsen der Antwort, die wird echt schwierig, besonders wenn Sie Zielen auf die Unterstützung einer relativ großen Teil des standard. Dinge wie Fehlerseiten, Weiterleitungen, Inhalte der Verhandlung und damit auf unser Leben ziemlich hart sein, wenn Sie reden zu beliebigen web-Server. Wenn auf der anderen Seite der server ist bekannt, gut erzogene, und eine einfache Fehlermeldung, ist alles in Ordnung für unerwartete server-Antwort, dann ist das relativ einfach als gut.