Можно ли создать веб-сервер на C++ с нуля без каких-либо библиотек или фреймворков?



Если бы ты дал мне:

  • технические характеристики оборудования,
  • свободно распространяемый компилятор C++ (без любой стандартная библиотека),
  • копии соответствующих стандартов,
  • эталонный дизайн аппаратного обеспечения для разработки, и
  • достаточно времени
  • Я уверен, что смогу создать базовый стек TCP/IP с базовым веб-сервером на его основе.

    Теперь стандарт C++ предписывает, что соответствующая отдельно стоящая реализация должна предоставлять минимальный набор заголовков и минимальную библиотеку поддержки. А компиляторы обычно имеют библиотеку поддержки, которая предоставляет небольшие вспомогательные функции, используемые генератором кода для странных операций, которые могут не поддерживаться непосредственно аппаратурой.

    Я предполагаю, что когда вы говорите “no libraries,” мне не разрешено даже это подмножество в качестве отправной точки. Но я также предполагаю, что вы не запрещаете мне создавать свои собственные библиотеки; скорее, вы просто запрещаете мне использовать уже существующую библиотеку.

    Часть из этого будет собрана. Это неизбежно. Так что, если мне не разрешат хотя бы немного языка ассемблера, то ответ будет следующим нет . Если мне разрешено использовать специфические для процессора расширения компилятора, я могу ограничить количество необходимого ассемблера.

    Итак, что мне нужно для сборки? (Все на C++, если не указано иное).

  • Минимальная низкоуровневая инициализация процессора (ассемблер)
  • Низкоуровневая инициализация времени выполнения C++ (ассемблер)
  • Библиотека поддержки компилятора (ассемблер)
  • Минимальная переработка стандартной библиотеки—, по крайней мере, тех частей, которые мне нужны. Возможно, для этого придется использовать расширения компилятора C++.
  • Оставшееся оборудование инициализируется.
  • Диспетчер прерываний. (смесь C++, ассемблер)
  • Базовая рабочая очередь / механизм сокращения времени. Я предполагаю, что мы можем обойтись кооперативной многозадачностью на основе обратного вызова.
  • Базовые драйверы для таймеров, пакетного ввода-вывода, объемного хранения и т.д.
  • Базовая файловая система для массового хранения данных.
  • Базовый стек TCP/IP. Вероятно, будет иметь множество ограничений.
  • Основной сервер HTTP 1.1.
  • Ни один из этих шагов не является особенно сложным. И я уверен в своей способности выполнить их, потому что у меня есть уже сделал большинство из них в той или иной форме.

    Я не писал стек TCP/IP или сервер HTTP 1.1, но если это что-то похожее на другую работу, которую я делал, то это в основном вопрос чтения и реализации необходимых спецификаций.

    Коллега по предыдущей работе $DAYJOB (Mike Denio) написал стек TCP/IP для наших DSP. Это выглядело трудоемким и утомительным, но не обязательно сверхсложным. И он написал его на смеси Си и ассемблера! C++ был бы роскошью по сравнению с этим.

    Самое сложное, на самом деле, это разобраться в некоторых спецификациях. Хороший набор вторичных источников (например, горсть книг У. Ричарда Стивенса) поможет в этом. Как сказал Майк, вы перелистываете страницу в TCP/IP иллюстрированный с машиной состояний, и вы реализуете эту машину состояний. Том 3 охватывает даже HTTP.

    Я уверен, что смог бы все это сделать, как я уже сказал, если бы у меня было достаточно времени.

    Я собираюсь предположить, что вы не полностью оценили объем работы, подразумеваемый вашим вопросом, когда вы его задали. Это говорит о том, что ответ для вас “no, вы не могу.”

    Видите, я ошибся насчет самого сложного. На самом деле самое сложное - это выяснить, какие основные части необходимо сделать, чтобы правильно определить объем работ. Выше я предположил, что все уже расписано.

    Теперь, если вы переработаете свой вопрос, чтобы разрешить стандартную библиотеку C++ и сокеты POSIX, вы будете в полном порядке. Это особенно верно, если ваш сервер не должен быть быстрым, масштабируемым, гибким или надежным—, т.е. домашний качественный веб-сервер.

    Сейчас вы находитесь на территории многонедельного домашнего задания по программированию для студентов 3-го курса, которое демонстрирует, что вы научились использовать bind , select , send , recv и т.д., и что вы можете анализировать и обрабатывать базовое подмножество HTTP-запросов.

    Например, вам обязательно нужно GET но, вероятно, можно пропустить POST . Если вы хотите быть настоящим чизером, просто всегда возвращайте временный редирект 302 на реальный веб-сервер для каждого запроса.

    Удачи!

    440   0  

    Comments

      Ничего не найдено.