Создайте простой HTTP-сервер в C

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

Ответ 1

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

Ответ 2

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

То, что вам нужно реализовать с помощью дополнительных шагов, это:

  • Получите ваш базовый уровень сокетов TCP (прослушивайте порт/порты, принимайте соединения с клиентом и отправляйте/получайте данные).
  • Внедрение буферизованного считывателя, чтобы вы могли читать запросы по одной строке (ограничиваясь CRLF) за раз.
  • Прочитайте первую строку. Разберите метод, версию запроса и путь.
  • Внедрить синтаксис заголовка для синтаксиса "Заголовок: значение". Не забывайте разворачивать сложенные заголовки.
  • Проверьте способ запроса, тип контента и размер содержимого, чтобы определить, как/если тело будет считано.
  • Внедрить декодирование содержимого на основе типа содержимого.
  • Если вы собираетесь поддерживать HTTP 1.1, реализуйте такие вещи, как "100 Continue", keep-alive, chunked transfer.
  • Добавить меры безопасности/безопасности, такие как обнаружение неполных запросов, ограничение максимального количества клиентов и т.д.
  • Сократите ваш код и с открытым исходным кодом:)

Ответ 3

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

Ответ 4

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

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

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

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

-Adam

Ответ 5

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

Ответ 6

Посмотрите на nweb (Nigel Web Server), "крошечный безопасный веб-сервер [...] с только 200 строк исходного кода C":

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

В статье представлены псевдокоды, пояснения и комментарии.

EDIT: ссылка IBM умерла. Я сохранил PDF файл веб-страницы на Google Диске. Вот загрузка кода:

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

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

Ответ 7

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

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

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

Ответ 8

HTTP spec и Firebug были очень полезны для мне, когда я должен был сделать это для моей домашней работы.

Удачи вам.:)

Ответ 9

Я бы предложил посмотреть источник на что-то вроде lighthttpd.

Ответ 10

http://www.manning.com/hethmon/ - "Иллюстрированное руководство по HTTP от Paul S. Hethmon" от Manning - очень хорошая книга для изучения протокола HTTP и будет очень полезен для тех, кто его реализует/расширяет.

Ответ 11

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