Можно ли создать веб-сервер на C++ с нуля без каких-либо библиотек или фреймворков?
Если бы ты дал мне:
Я уверен, что смогу создать базовый стек TCP/IP с базовым веб-сервером на его основе.
Теперь стандарт C++ предписывает, что соответствующая отдельно стоящая реализация должна предоставлять минимальный набор заголовков и минимальную библиотеку поддержки. А компиляторы обычно имеют библиотеку поддержки, которая предоставляет небольшие вспомогательные функции, используемые генератором кода для странных операций, которые могут не поддерживаться непосредственно аппаратурой.
Я предполагаю, что когда вы говорите “no libraries,” мне не разрешено даже это подмножество в качестве отправной точки. Но я также предполагаю, что вы не запрещаете мне создавать свои собственные библиотеки; скорее, вы просто запрещаете мне использовать уже существующую библиотеку.
Часть из этого будет собрана. Это неизбежно. Так что, если мне не разрешат хотя бы немного языка ассемблера, то ответ будет следующим нет . Если мне разрешено использовать специфические для процессора расширения компилятора, я могу ограничить количество необходимого ассемблера.
Итак, что мне нужно для сборки? (Все на C++, если не указано иное).
Ни один из этих шагов не является особенно сложным. И я уверен в своей способности выполнить их, потому что у меня есть уже сделал большинство из них в той или иной форме.
Я не писал стек 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 на реальный веб-сервер для каждого запроса.
Удачи!
Comments