Программирование HTTP-сервера - PullRequest
6 голосов
/ 25 октября 2010

Я пытаюсь написать свой собственный сервер 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

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Я бы порекомендовал посмотреть GNU libmicrohttpd .Он прямо сфокусирован на предоставлении основы для построения серверов HTTP 1.1.Он небольшой и поддерживает работу с потоками и без них.(Лично я использую его без потоков. Он также имеет несколько моделей потоков.)

Даже если вы решите написать свой веб-сервер с нуля, я бы посоветовал взглянуть на libmicrohttpd , чтобы получить представление оне только то, как работает протокол, но и то, как библиотека очень четко моделирует «рабочий процесс» веб-сервера.Я думаю, что было бы ошибкой представлять, что keep-alive подразумевает многопоточность, и я думаю, что это препятствует пониманию keep-alive.

(Что касается кредитов Apache как веб-сервера, они довольно большие, и много там не связано с протоколами, а скорее с такими вещами, как его система плагинов и т. д.)

1 голос
/ 25 октября 2010

Возможно, вы могли бы взглянуть на код Apache , чтобы найти некоторые подсказки. Это написано в C.

Надеюсь, кто-нибудь придет и даст более подробный ответ:)

1 голос
/ 25 октября 2010

Я бы порекомендовал взять исходники для Apache и посмотреть, как они справляются с этим.В псевдо-коде нет особого смысла, когда вы видите, как работает реальная вещь.

...