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
Jak o RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
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). –
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