Создайте сервер сокетов TCP/IPv4 с помощью C++.

Исходный код

Статьи, которые я прочитал

Мне потребовалось около восемнадцати часов, чтобы просмотреть большую часть документации. Я также ознакомился с некоторыми подробностями стандарта HTTP RFC — Hyper-Text Transfer Protocol Request For Comment.

Мне потребовалось некоторое время, чтобы понять, как написать HTTP-ответ на сокет.

От использования C++ и документации по программированию сокетов в документации Microsoft до HTML-страницы. HTTP-ответ — это просто текст. Как только у меня появился код, который мог принимать клиентский сокет, чтобы я мог писать в него, у меня возникла проблема. Мне удалось написать строку вроде этого «привет»:

Но после этого я задался вопросом, почему браузер не показывает это как HTML. Я понял, что это потому, что браузеру нужно знать тип содержимого моего ответа. Это означало бы, что мне нужно добавить заголовок HTTP к моему ответу от сервера. Поэтому я попытался сделать это так:

Я не увидел проблемы в этом ответе. Итак, я запустил браузер, зашел на локальный хост, и, к моему удивлению, ответ был таким:

Поэтому мне нужно было добавить пробел между ними.

Это не сработало. Хорошо, поскольку ответ HTTP представляет собой обычный текст, как отформатировать его для работы? Прочтите RFC для HTTP, подумал я!

Они говорят мне делать то же самое, что и я. Но, к сожалению, RFC показывает только часть ответа HTTP. Я был уверен, что хорошо подготовил ответ, но чего-то не хватало.

Поскольку RFC не ответил, я решил погуглить — написать сокет HTTP-заголовка. И оказывается, я был близок. Появился этот ответ StackOverflow, он показал HTTP-ответ с использованием python и напоминал то, что я пытался сделать. Код HTTP-ответа на StackOverflow начинался так:

Блин, вот чего мне не хватало. Но код ответа StackOverflow использует версию 1.0, а я использую 1.1 в соответствии с тем, что записывает мой сервер. Так почему же в конце каждой строки есть экранированные символы?

При беглом взгляде я заметил комментарий, в котором говорилось следующее:

«… и не забудьте заменить \n\n на \r\n\r\n, так как HTTP требует CRLF после заголовков».

Так вот оно что; Мне нужны были эти экранированные символы. Но есть еще один момент: зачем дублировать экранированные символы? Он использовал такие форматы, как:

Почему это так? Поэтому я попытался добавить еще один заголовок:

Это не работает. Почему? Это потому, что нам нужно одно полностью разделенное пространство между телом ответа и заголовками. Таким образом, формат ответа HTTP (согласно моему нынешнему пониманию, которое может быть неправильным) выглядит следующим образом:

Или другими словами:

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

Я получил массу удовольствия, исследуя HTTP и сокеты в C++!

👋 Если вы считаете это полезным, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏 ниже, чтобы выразить свою поддержку автору 👇

🚀Присоединяйтесь к сообществу разработчиков FAUN и получайте похожие истории в свой почтовый ящик каждую неделю