2010-10-25 12 views
6

Próbuję napisać własny serwer http 1.1, tylko dla zabawy i nauki o HTTP, gniazdach i wątkach.Serwer HTTP Programowanie

Mam dobry start, myślę, że dostarczam tylko statyczne strony (używając c, na którym wolałbym zostać na razie). Mam stronę testową, którą napisałem jakiś czas temu i dostarczam jej ~ 50 plików w 124ms zgodnie z chromem, bez używania wątków ani podtrzymywania gniazd.

Stwierdziłem, że bardzo trudno jest w ogóle pracować przy gwintowaniu/utrzymywaniu aktywności. W internecie niewiele jest zasobów (które można znaleźć w moich godzinach korzystania z Googling), które wyjaśniają szczegółowo połączenia podtrzymujące połączenie. Gdyby ktoś mógł polecić dobrą książkę na temat programowania serwerów HTTP, byłbym bardzo wdzięczny.

Wykonałem już programowanie wątków i gniazd, wykonując prosty program do czatowania, więc mam przynajmniej pewne doświadczenie z nim.

Problem, który mam, polega na tym, że podczas próby włączenia wątków przeglądarka klienta ustawia wiele połączeń. Gdzieś po linii serwer się myli i klient siedzi po prostu czekając na odpowiedź, a serwer przestaje cokolwiek robić. Wysyłam nagłówek Connection: Keep-Alive, ale to niczego nie zmienia, a gdy włączę go do życia i utworzę pętlę dla otrzymywania żądań w funkcji wątku, to zatrzymuje się, aż połączenie zostanie zamknięte.

Byłbym wdzięczny, gdyby ktoś mógł podać mi jakiś pseudo-kod, jak utrzymywać przy życiu/wątki pracujące, aby klient przestał tworzyć wiele połączeń naraz.

krótki opis co się dzieje:

main function

load in static pages to large array of fileinfo struct that hold the file data and length 
create the socket 
set it to listen to port 80 
set it to listen for 10 connections at a time(i know this is low...) 
start an endless loop 
     block while waiting for someone to connect 
     check if it's a localhost connection 
      shutdown the server 
     otherwise 
      start a thread(with pthread), sending it the socket variable 
loop 


Thread Function

setsock opt for 3 sec timeout on send/recv and enable Keep-alive 
start endless loop 
    read in request 
    if request timed out, break the loop 
    Validate Request function call 
    Create Reponse function call 
    Send response 
    if request contained Connection: close header break the loop 
loop 
close socket 
return 

+1

Jak o RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

Czy jesteś pewien, że to problem związany z wątkami? Czy ustawiasz również nagłówek Content-Length? Myślę, że jest to wymagane, aby utrzymać się przy życiu (chyba że używasz chunkingu). –

+0

Używam również nagłówka długości treści i wysyłam odpowiedni rozmiar dla każdej wiadomości. Jedynym powodem, dla którego mówię, że jest związany z wątkiem, jest to, że nie mam problemów, dopóki nie zacznę używać wątków. Jeśli spróbuję wdrożyć funkcję keep-alive bez wątków, wystarczy, że strona będzie dostarczać na zawsze. – Wolftousen

Odpowiedz

1

Polecam chwytając źródło dla Apache i widząc, jak oni sobie z tym poradzić. W kodzie psuedo nie ma sensu, kiedy można zobaczyć, jak działa prawdziwa.

+0

Wielkie umysły myślą podobnie ? ;) – alex

+0

nasze odpowiedzi musiały minąć w rurkach :) –

1

Być może mógłbyś spojrzeć na Apache's code po kilka wskazówek. Jest napisany w C

Mam nadzieję, że ktoś przyjdzie i dać bardziej szczegółową odpowiedź :)

+0

Staram się unikać robienia tego tak bardzo, jak to możliwe. Niedawno zacząłem, ale filtrowanie rzeczy, których nie potrzebuję w tej chwili, z rzeczy, których potrzebuję, jest bardzo czasochłonne. – Wolftousen

2

Polecam patrząc na GNU libmicrohttpd. Koncentruje się na dostarczaniu ram, na których można budować serwery HTTP 1.1. Jest mały i podtrzymuje przy życiu z nawlekaniem i bez gwintowania. (Osobiście używam go bez gwintowania.) Ma on kilka modeli wątków.)

Nawet jeśli zdecydujesz się na napisanie swojego serwera sieciowego od podstaw, proponuję przejrzeć libmicrohttpd, aby uzyskać wgląd nie tylko w to, jak działa protokół, ale w jaki sposób biblioteka modeluje "przepływ pracy" serwera WWW w bardzo czysty sposób. Myślę, że błędem jest wyobrażać sobie, że keep-alive oznacza przewlekanie i myślę, że jest przeszkodą w zrozumieniu utrzymywania przy życiu.

(chodzi o kredyty Apacze jako serwer WWW, to jest dość duże, a tam jest dużo tam nie związane z protokołami, ale takie rzeczy jak jego system wtyczek i tak dalej.)

+0

Dzięki, zajrzę do tego po tym, jak dziś stracę pracę. – Wolftousen