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?


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?


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.


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 :)

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.


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.


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.


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


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





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.


1

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.