Я пытаюсь написать свой собственный сервер http 1.1, просто для удовольствия и узнать больше о HTTP, сокетах и потоках.
Я получил хорошее начало, думаю, только с доставкой статических страниц(используя c, в котором я бы предпочел остаться).У меня есть тестовая страница, которую я написал некоторое время назад, и она доставляет ~ 50 файлов за 124 мс в соответствии с Chrome, без использования потоков или поддерживающих сокетов.
Мне было очень трудно получить многопоточность / сохранить-Живой работает на всех.В Интернете практически нет ресурсов (которые я могу найти во время моих поисков в Google), которые подробно объясняют поддерживающие соединения.Если бы кто-нибудь мог порекомендовать хорошую книгу по программированию HTTP-сервера, я был бы очень признателен.
Ранее я занимался программированием потоков и сокетов, создав простую программу чата, поэтому у меня есть хотя бы некоторый опыт работы с ней..
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь включить потоки, клиентский браузер устанавливает несколько соединений.Где-то на этом пути сервер запутывается, а клиент просто сидит и ждет ответов, а сервер перестает что-либо делать.Я отправляю заголовок Connection: Keep-Alive, но это ничего не меняет, и когда я включаю keep-alive и создаю цикл для получения запросов в поточной функции, он останавливается, пока соединение не будет закрыто.
Я был бы признателен, если бы кто-нибудь дал мне какой-нибудь псевдокод о том, как заставить это работать / работать с потоками, чтобы клиент прекратил создавать несколько соединений одновременно.
Краткое описание того, что происходит:
main function </p>
<pre><code> 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 </p>
<pre><code> 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