Создайте простой HTTP-сервер на C [закрыто]


105

Мне нужно создать простой HTTP-сервер на C. Есть какие-нибудь рекомендации? Ссылки? Образцы?


1
Я так и думал
Рик

1
У меня тоже была такая же проблема. Я воспользовался этой ссылкой . Надеюсь, это тебе тоже поможет.
Удара СС Лиянаге

1
как насчет FAQ о том, как задать вопрос. вы должны знать после 3К в представлении, что это не настоящий вопрос, как он может получить столько голосов?

Как насчет этого> github.com/Taymindis/fcgi-function/wiki/…
Oktaheta

1
Это, по-видимому, очень полезный вопрос. Почему закрыто?
McBear Holden 06

Ответы:


85

Предлагаю вам взглянуть на крошечный httpd . Если вы хотите написать его с нуля, то вы хотите , чтобы тщательно прочитать RFC 2616 . Используйте сокеты BSD для доступа к сети на действительно низком уровне.


2
Или используйте inetd и пропустите сетевую часть.
jrockway

22
Не читайте RFC 2616 сейчас, он устарел: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpdтакже на github здесь: github.com/larryhe/tinyhttpd
Purplejacket

119

Я бы порекомендовал вам взглянуть на: Практическое руководство по написанию клиентов и серверов.

Что вам нужно реализовать поэтапно:

  1. Запустите свой базовый уровень сокетов TCP (прослушивание порта / портов, прием клиентских подключений и отправка / получение данных).
  2. Реализуйте буферизованный считыватель, чтобы вы могли читать запросы по одной строке (с разделением CRLF) за раз.
  3. Прочтите самую первую строчку. Разберите метод, версию запроса и путь.
  4. Реализуйте синтаксический анализ заголовка для синтаксиса «Заголовок: значение». Не забудьте развернуть сложенные заголовки.
  5. Проверьте метод запроса, тип содержимого и размер содержимого, чтобы определить, как / если будет прочитано тело.
  6. Реализуйте декодирование контента на основе типа контента.
  7. Если вы собираетесь поддерживать HTTP 1.1, реализуйте такие вещи, как «100 Continue», keep-alive, фрагментированная передача.
  8. Добавьте меры надежности / безопасности, такие как обнаружение неполных запросов, ограничение максимального количества клиентов и т. Д.
  9. Оберните ваш код в термоусадочную пленку и откройте его :)

Пункт № 9, особенно после того, как вы разместили здесь вопрос, +1 :)
Матье

26

HTTP-сервер концептуально прост:

  • Откройте порт 80 для прослушивания
  • Когда контакт установлен, соберите немного информации (получите в основном - остальное пока можете игнорировать)
  • Перевести запрос в файловый запрос
  • Откройте файл и плюйте обратно клиенту

Это становится сложнее в зависимости от того, сколько HTTP вы хотите поддерживать - POST немного сложнее, скрипты, обработка нескольких запросов и т. Д.

Но база очень простая.


25

Mongoose (ранее Simple HTTP Daemon) довольно хорош. В частности, он встраивается и компилируется под Windows, Windows CE и UNIX.


12

Откройте TCP-сокет на порту 80, начните прослушивать новые соединения, реализуйте это . В зависимости от ваших целей вы можете игнорировать практически все. В самом простом случае вы можете отправлять один и тот же ответ на каждый запрос, который просто включает запись текста в сокет.


11

Посмотрите на nweb (веб-сервер Найджела), «крошечный безопасный веб-сервер [...] всего с 200 строками исходного кода C»:

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

Статья содержит псевдокод, пояснения и комментарии.

РЕДАКТИРОВАТЬ: ссылка IBM умерла. Я сохранил PDF-файл веб-страницы на Google Диске. Вот код для скачивания:

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing

@ ankushagarwal внес несколько изменений и загрузил свою версию на GitHub: https://github.com/ankushagarwal/nweb


Эх до проголосовали, не проверяя ссылку: / Я ищу именно то, что вы упомянули, если вы что-то найдете, можете ли вы меня пропинговать? Txt
samayo

1
@samayo Ссылка IBM умерла. Я предоставил несколько зеркал.
XP1 01

Вот зеркало от archive.org, которое, надеюсь, будет в будущем: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246

5

Я написал свой собственный, который вы можете использовать. Этот работает с sqlite, потокобезопасен и написан на C ++ для UNIX.

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

http://code.google.com/p/mountain-cms/




2

http://www.manning.com/hethmon/ - «Иллюстрированное руководство по HTTP от Пола С. Хетмона» от Мэннинга - очень хорошая книга для изучения протокола HTTP, и она будет очень полезна тем, кто его реализует / расширяет.


1

Используйте специфичные для платформы функции сокетов для инкапсуляции протокола HTTP, как это сделали парни из Apache .


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.