Zbuduj prosty serwer HTTP w C [zamknięte]

105

Muszę zbudować prosty serwer HTTP w C. Jakieś wskazówki? Spinki do mankietów? Próbki?

Nathan H.
źródło
1
Dokładnie tak myślałem
Rik,
1
Teraz też miałem ten sam problem. Skorzystałem z tego linku . Mam nadzieję, że to też ci pomoże.
Udara SS Liyanage
1
co powiesz na FAQ, jak zadać pytanie. powinieneś wiedzieć po 3K w rep, że to nie jest prawdziwe pytanie, jak to może zdobyć tyle pozytywnych głosów?
Co powiesz na to> github.com/Taymindis/fcgi-function/wiki/...
Oktaheta
1
To najwyraźniej bardzo przydatne pytanie. Dlaczego jest zamknięty?
McBear Holden

Odpowiedzi:

85

Proponuję przyjrzeć się małemu httpd . Jeśli chcesz napisać go od zera, powinieneś dokładnie przeczytać RFC 2616 . Użyj gniazd BSD, aby uzyskać dostęp do sieci na naprawdę niskim poziomie.

Adam Rosenfield
źródło
2
Lub użyj inetd i pomiń część dotyczącą sieci.
jrockway
22
Nie czytaj RFC 2616 teraz, jest przestarzały przez: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir
2
tiny httpdjest również na github tutaj: github.com/larryhe/tinyhttpd
Purplejacket.
119

Polecam zapoznać się z: Praktycznym przewodnikiem po pisaniu klientów i serwerów

To, co musisz wdrożyć w krokach przyrostowych, to:

  1. Uruchom podstawową warstwę gniazd TCP (nasłuchuj na porcie / portach, akceptuj połączenia klientów i wysyłaj / odbieraj dane).
  2. Zaimplementuj buforowany czytnik, aby można było odczytywać żądania w jednym wierszu (rozdzielanym CRLF) na raz.
  3. Przeczytaj pierwszą linię. Przeanalizuj metodę, wersję żądania i ścieżkę.
  4. Zaimplementuj analizę nagłówka dla składni „Nagłówek: wartość”. Nie zapomnij rozłożyć złożonych nagłówków.
  5. Sprawdź metodę żądania, typ zawartości i rozmiar treści, aby określić, jak / czy treść zostanie odczytana.
  6. Implementuj dekodowanie treści w oparciu o typ zawartości.
  7. Jeśli zamierzasz obsługiwać protokół HTTP 1.1, zaimplementuj takie rzeczy, jak „100 Continue”, utrzymywanie aktywności, fragmentaryczny transfer.
  8. Dodaj solidność / środki bezpieczeństwa, takie jak wykrywanie niekompletnych żądań, ograniczenie maksymalnej liczby klientów itp.
  9. Zmniejsz opakowanie swojego kodu i otwórz go :)
Ates Goral
źródło
Punkt 9, zwłaszcza po zamieszczeniu tutaj pytania, +1 :)
Matthieu
26

Serwer HTTP jest koncepcyjnie prosty:

  • Otwórz port 80 do słuchania
  • Po nawiązaniu kontaktu zbierz trochę informacji (zdobądź głównie - resztę na razie możesz zignorować)
  • Przetłumacz żądanie na żądanie pliku
  • Otwórz plik i wypluj go z powrotem na klienta

Staje się trudniejsze w zależności od tego, ile HTTP chcesz obsługiwać - POST jest nieco bardziej skomplikowany, skrypty, obsługa wielu żądań itp.

Ale podstawa jest bardzo prosta.

Adam Davis
źródło
25

Mongoose (dawniej Simple HTTP Daemon) jest całkiem niezły. W szczególności można go osadzać i kompilować pod Windows, Windows CE i UNIX.

Bob Nadler
źródło
12

Otwórz gniazdo TCP na porcie 80, zacznij nasłuchiwać nowych połączeń, zaimplementuj to . W zależności od celów możesz zignorować prawie wszystko. Najprościej możesz wysłać tę samą odpowiedź na każde żądanie, co wiąże się tylko z wpisaniem tekstu do gniazda.

Zaćmienie
źródło
11

Spójrz na nweb (serwer WWW Nigela), „mały, bezpieczny serwer sieciowy [...] z zaledwie 200 wierszami kodu źródłowego w języku C”:

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

Artykuł zawiera pseudokod, wyjaśnienia i komentarze.

EDYCJA: łącze IBM nie działa. Zapisałem plik PDF strony internetowej na Dysku Google. Oto kod do pobrania:

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

@ ankushagarwal wprowadził kilka zmian i przesłał swoją wersję na GitHub: https://github.com/ankushagarwal/nweb

XP1
źródło
Eh up głosowało bez sprawdzania linku: / Szukam dokładnie tego, o czym wspomniałeś, jeśli coś znajdziesz, czy możesz do mnie pingować? Txt
samayo
1
Link @samayo IBM nie działa. Udostępniłem kilka luster.
XP1
Oto kopia
james246
5

Napisałem własny, z którego możesz skorzystać. Ten działa z sqlite, jest bezpieczny dla wątków i jest w C ++ dla UNIX.

Powinieneś być w stanie go rozebrać i użyć kodu kompatybilnego z C.

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

Daniel A. White
źródło
5

Specyfikacji HTTP i Firebug były bardzo przydatne dla mnie, gdy miałem to zrobić dla mojej domowej.

Powodzenia z twoim. :)

Omer van Kloeten
źródło
4

Proponuję spojrzeć na źródło do czegoś takiego jak lighthttpd .

królikarnia
źródło
2

http://www.manning.com/hethmon/ - „Ilustrowany przewodnik po HTTP autorstwa Paula S. Hethmona” autorstwa Manninga to bardzo dobra książka do nauki protokołu HTTP i będzie bardzo przydatna dla kogoś, kto go implementuje / rozszerza.

anjanb
źródło
1

Użyj funkcji gniazd specyficznych dla platformy, aby hermetyzować protokół HTTP, tak jak zrobili to ludzie stojący za Apache .

arul
źródło