Erstellen Sie einen einfachen HTTP-Server in C [geschlossen]

105

Ich muss einen einfachen HTTP-Server in C erstellen. Irgendwelche Anleitungen? Links? Proben?

Nathan H.
quelle
1
Genau das habe ich mir gedacht
Rik
1
Ich hatte jetzt auch das gleiche Problem. Ich habe diesen Link benutzt . Hoffe das wird dir auch helfen.
Udara SS Liyanage
1
Wie wäre es mit den FAQ zum Stellen einer Frage? Sie sollten nach 3K in rep wissen, dass dies keine echte Frage ist, wie kann es so viele Stimmen bekommen?
Wie wäre es damit> github.com/Taymindis/fcgi-function/wiki/…
Oktaheta
1
Dies ist anscheinend eine sehr nützliche Frage. Warum ist es geschlossen?
McBear Holden

Antworten:

85

Ich schlage vor, Sie werfen einen Blick auf winzige httpd . Wenn Sie es von Grund auf neu schreiben möchten, sollten Sie RFC 2616 gründlich lesen . Verwenden Sie BSD-Sockets , um auf einer sehr niedrigen Ebene auf das Netzwerk zuzugreifen.

Adam Rosenfield
quelle
2
Oder verwenden Sie inetd und überspringen Sie den Netzwerkteil.
Jrockway
22
Lesen Sie jetzt nicht RFC 2616 , es ist veraltet von: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
Songhir
2
tiny httpdist auch auf Github hier: github.com/larryhe/tinyhttpd
Purplejacket
119

Ich würde empfehlen, dass Sie sich Folgendes ansehen: Eine praktische Anleitung zum Schreiben von Clients und Servern

Was Sie in inkrementellen Schritten implementieren müssen, ist:

  1. Starten Sie Ihre grundlegende TCP-Sockets-Schicht (überwachen Sie Port / Ports, akzeptieren Sie Clientverbindungen und senden / empfangen Sie Daten).
  2. Implementieren Sie einen gepufferten Reader, damit Sie Anforderungen zeilenweise (durch CRLF getrennt) lesen können.
  3. Lesen Sie die erste Zeile. Analysieren Sie die Methode, die Anforderungsversion und den Pfad.
  4. Implementieren Sie die Header-Analyse für die Syntax "Header: Wert". Vergessen Sie nicht, gefaltete Header zu entfalten.
  5. Überprüfen Sie die Anforderungsmethode, den Inhaltstyp und die Inhaltsgröße, um festzustellen, wie / ob der Text gelesen wird.
  6. Implementieren Sie die Dekodierung von Inhalten basierend auf dem Inhaltstyp.
  7. Wenn Sie HTTP 1.1 unterstützen möchten, implementieren Sie Dinge wie "100 Continue", Keep-Alive, Chunked Transfer.
  8. Fügen Sie Robustheits- / Sicherheitsmaßnahmen wie das Erkennen unvollständiger Anforderungen, das Begrenzen der maximalen Anzahl von Clients usw. hinzu.
  9. Shrink Wrap deinen Code und Open Source ihn :)
Ates Goral
quelle
Punkt # 9, besonders nach dem Posten einer Frage hier, +1 :)
Matthieu
26

Ein HTTP-Server ist konzeptionell einfach:

  • Öffnen Sie Port 80 zum Abhören
  • Wenn Kontakt hergestellt wird, sammeln Sie ein paar Informationen (hauptsächlich - Sie können den Rest vorerst ignorieren)
  • Übersetzen Sie die Anfrage in eine Dateianforderung
  • Öffnen Sie die Datei und spucken Sie sie auf dem Client zurück

Es wird schwieriger, je nachdem, wie viel HTTP Sie unterstützen möchten - POST ist etwas komplizierter, Skripte, die Bearbeitung mehrerer Anforderungen usw.

Aber die Basis ist sehr einfach.

Adam Davis
quelle
25

Mungo (ehemals einfacher HTTP-Daemon) ist ziemlich gut. Insbesondere kann es eingebettet und unter Windows, Windows CE und UNIX kompiliert werden.

Bob Nadler
quelle
12

Öffnen Sie einen TCP-Socket an Port 80, warten Sie auf neue Verbindungen und implementieren Sie diese . Abhängig von Ihren Zwecken können Sie fast alles ignorieren. Im einfachsten Fall können Sie für jede Anfrage dieselbe Antwort senden, bei der lediglich Text in den Socket geschrieben wird.

Finsternis
quelle
11

Schauen Sie sich nweb (Nigels Webserver) an, "einen winzigen, sicheren Webserver [...] mit nur 200 Zeilen C-Quellcode":

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

Der Artikel enthält Pseudocode, Erklärungen und Kommentare.

BEARBEITEN: IBMs Link ist gestorben. Ich habe ein PDF der Webseite in Google Drive gespeichert. Hier ist der Code-Download:

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing

@ ankushagarwal hat einige Änderungen vorgenommen und seine Version auf GitHub hochgeladen: https://github.com/ankushagarwal/nweb

XP1
quelle
Eh up abgestimmt, ohne den Link zu überprüfen: / Ich suche genau das, was Sie erwähnt haben. Wenn Sie etwas finden, können Sie mich anpingen? Txt
Samayo
1
@samayo IBMs Link ist gestorben. Ich habe einige Spiegel zur Verfügung gestellt.
XP1
Hier ist ein Spiegel von archive.org - der hoffentlich in den kommenden Jahren verfügbar sein wird
james246
5

Ich habe meine eigenen geschrieben, die Sie verwenden können. Dieser funktioniert mit SQLite, ist threadsicher und ist in C ++ für UNIX.

Sie sollten in der Lage sein, es auseinander zu nehmen und den C-kompatiblen Code zu verwenden.

http://code.google.com/p/mountain-cms/

Daniel A. White
quelle
5

Die HTTP-Spezifikation und Firebug waren für mich sehr nützlich, als ich sie für meine Hausaufgaben machen musste.

Viel Glück mit dir. :) :)

Omer van Kloeten
quelle
2

http://www.manning.com/hethmon/ - "Illustrated Guide to HTTP von Paul S. Hethmon" von Manning ist ein sehr gutes Buch zum Erlernen des HTTP-Protokolls und wird für jemanden, der es implementiert / erweitert, sehr nützlich sein.

anjanb
quelle
1

Verwenden Sie plattformspezifische Socket-Funktionen, um das HTTP-Protokoll zu kapseln, genau wie die Leute hinter Apache .

arul
quelle