Створіть простий сервер HTTP в C [закрито]


105

Мені потрібно створити простий сервер HTTP в C. Будь-які вказівки? Посилання? Зразки?


1
Саме так я і подумав
Рік

1
У мене також була така ж проблема і зараз. Я використовував це посилання . Сподіваюся, що це теж допоможе.
Udara SS Liyanage

1
як щодо поширених запитань про те, як задати питання. ви повинні знати після 3K в реп, що це не справжнє питання, як можна отримати стільки голосів?


1
Це, мабуть, дуже корисне питання. Чому він закритий?
McBear Holden

Відповіді:


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 Продовжуйте", продовжуйте жити, чудово передавати.
  8. Додайте надійність / заходи безпеки, такі як виявлення неповних запитів, обмеження максимальної кількості клієнтів тощо.
  9. Оберніть свій код і відкрийте його :)

Пункт №9, особливо після публікації запитання тут, +1 :)
Матьє

26

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

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

Це стає складніше залежно від того, скільки HTTP ви хочете підтримувати - POST трохи складніше, сценарії, обробка декількох запитів тощо.

Але основа дуже проста.


25

Мангуст (раніше простий HTTP-демон) досить непоганий. Зокрема, він вбудовується та компілюється під 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/

Стаття включає псевдокод, пояснення та коментарі.

EDIT: посилання 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

Ось дзеркало 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 Пола С. Хетмона" від Manning - це дуже хороша книга для вивчення протоколу HTTP і буде дуже корисною для тих, хто її реалізує / розширює.


1

Використовуйте для платформи функції сокета для інкапсуляції протоколу HTTP, як робили хлопці, що стояли за Apache .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.