Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563

Http веб сервер на базе C++

10.06.2023, 21:26. Показов 2428. Ответов 3
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть задача написать небольшой HTTP-сервер на базе C++. Подскажите, пожалуйста, какие есть популярные и проверенные временем библиотеки?

P.S.:
1. Да, есть Qt, где есть все готовое, бери и пиши, но после прошлогодних событий есть проблема с доступом к бинарникам библиотек на территории России, поэтому ищу альтернативы.
2. Есть Boost.Asio, но в нем нет готовых классов для работы http. Есть, конечно, примеры в том числе и на официальном сайте Boost с реализацией таких классов, но пока что вариант выглядит не очень.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2023, 21:26
Ответы с готовыми решениями:

1С веб сервер авторизация AD http://server/base = вход - ок, http://server.domain.local =запрашивает логин+пароль
Доброго дня! Настроил web сервер для 1С... Win аутентификация при вводе http://server/base - происходит вход в БД при вводе...

Веб сервер (http) на нестандартном порте
Надеюсь не ошибся разделом, смотрите, разжился бесплатным доменным именем в зоне .TK и бесплатным VPS сервером (www.vps.me), но как я понял...

ошибка Ошибка HTTP 403.14 - Forbidden Веб-сервер настроен таким образом, чтобы не формировать списка содержимого каталога
вообщем создаю тупо пустой веб сайт ничего в нем не меняю и не трогаю запускаю,получаю такую ошибку: Ошибка HTTP 403.14 - Forbidden...

3
Модератор
Эксперт Java
 Аватар для alecss131
2843 / 1352 / 403
Регистрация: 11.08.2017
Сообщений: 4,321
Записей в блоге: 2
10.06.2023, 23:15
Лучший ответ Сообщение было отмечено BlackStoneBlack как решение

Решение

Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Есть Boost.Asio, но в нем нет готовых классов для работы http
Зато есть Boost.Beast который как раз реализует http
Я например писал недавно http сервер в связке Asio + Beast, который просто выдавал файлы по запросу к нему
вот тот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <vector>
#include <filesystem>
#include <string>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <fstream>
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response);
std::string mimeType(const std::string &path);
 
int main(int argc, char **argv) {
    if (argc == 1) {
        std::string name{std::filesystem::path{argv[0]}.filename().string()};
        std::cout << "use: " << name << " [port]" << std::endl;
    }
    uint16_t port{8080};
    if (argc == 2) {
        port = std::stoi(argv[1]);
    }
    try {
        boost::asio::io_context ioc{};
        boost::asio::ip::tcp::endpoint ep{boost::asio::ip::tcp::v4(), port};
        boost::asio::ip::tcp::acceptor acceptor{ioc, ep};
        std::cout << "server run on port: " << port << std::endl;
        while (true) {
            boost::asio::ip::tcp::socket socket{ioc};
            acceptor.accept(socket);
            boost::beast::http::request<boost::beast::http::dynamic_body> request{};
            boost::beast::flat_buffer buffer{};
            boost::beast::http::read(socket, buffer, request);
            boost::beast::http::response<boost::beast::http::dynamic_body> response{};
            work(request, response);
            boost::beast::http::write(socket, response);
            socket.close();
        }
    } catch(boost::system::system_error &e) {
        std::cout << e.what() << std::endl;
        return -1;
    }
}
 
void work(const boost::beast::http::request<boost::beast::http::dynamic_body> &request,
          boost::beast::http::response<boost::beast::http::dynamic_body> &response) {
    response.version(request.version());
    response.keep_alive(false);
    std::string path{request.target()};
    std::cout << "connection: " << path << std::endl;
    if (path == "/") {
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Main page</title><head>"
                                               << "<body><h1 align=\"center\">Hello, World!</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
        return;
    }
    if (path[0] == '/') {
        path = path.substr(1);
    }
    if (path.find('?') != std::string::npos) {
        path = path.substr(0, path.find('?'));
    }
    if (std::filesystem::exists(path)) {
        std::streamsize sz{static_cast<std::streamsize>(std::filesystem::file_size(path))};
        std::vector<char> data(sz);
        std::ifstream file{path, std::ios::binary};
        file.read(data.data(), sz);
        file.close();
        response.result(boost::beast::http::status::ok);
        response.set(boost::beast::http::field::content_type, mimeType(path));
        boost::beast::ostream(response.body()).write(data.data(), sz);
        response.content_length(sz);
    } else {
        response.result(boost::beast::http::status::not_found);
        response.set(boost::beast::http::field::content_type, "text/html");
        boost::beast::ostream(response.body()) << "<!DOCTYPE html><html><head><title>Not Found</title><head>"
                                          << "<body><h1 align=\"center\">404 Not found</h1></body></html>" << std::endl;
        response.content_length(response.body().size());
    }
}
 
std::string mimeType(const std::string &path) {
    std::string ext{std::filesystem::path(path).extension().string()};
    if (ext == ".htm" || ext == ".html") return "text/html";
    if (ext == ".php") return "application/php";
    if (ext == ".css") return "text/css";
    if (ext == ".txt") return "text/plain";
    if (ext == ".js") return "application/javascript";
    if (ext == ".json") return "application/json";
    if (ext == ".gz") return "application/gzip";
    if (ext == ".tar") return "application/x-tar";
    if (ext == ".rar") return "application/vnd.rar";
    if (ext == ".zip") return "application/zip";
    if (ext == ".7z") return "application/x-7z-compressed";
    if (ext == ".pdf") return "application/pdf";
    if (ext == ".xml") return "application/xml";
    if (ext == ".swf") return "application/x-shockwave-flash";
    if (ext == ".flv") return "video/x-flv";
    if (ext == ".png") return "image/png";
    if (ext == ".jpeg" || ext == ".jpg" || ext == ".jpe") return "image/jpeg";
    if (ext == ".gif") return "image/gif";
    if (ext == ".bmp") return "image/bmp";
    if (ext == ".ico") return "image/vnd.microsoft.icon";
    if (ext == ".tiff" || ext == ".tif") return "image/tiff";
    if (ext == ".svg" || ext == ".svgz") return "image/svg+xml";
    return "application/text";
}
Есть еще веб фреймворк wt и библиотека похожая на буст но поскромнее poco
1
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
12.06.2023, 07:24
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Подскажите, пожалуйста, какие есть популярные и проверенные временем библиотеки?
libmicrohttpd
1
 Аватар для Shooter85
0 / 0 / 0
Регистрация: 18.07.2023
Сообщений: 27
18.07.2023, 22:34
Есть ещё fastcgi++ https://fastcgipp.isatec.ca/index.html.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2023, 22:34
Помогаю со студенческими работами здесь

Написать веб-сервис, который будет общаться по http c другим веб-сервисом
Здравствуйте уважаемые коллеги! Извините за заголовок, не знал как лучше назвать эту тему. Вопрос в следующем ...Нужно написать веб...

http server,http сервер, post
Необходимо реализовать функцию post для http сервера Косяк как принимать сообщение отправленное - вот этой формой и сам сервер При...

http клиент и http сервер на Python
Клиент должен уметь кидать запросы на сервер с адресом http://127.0.0.1:{port}/{method} , где port – целое число, приходит первой строкой...

Как безопасно организовать общение сервер-клиенты, если сервер обращается по http?
Разрабатываю архитектуру, при которой некий сервер(сервер) дёргает некое конечное колличество клиентов(серверов) по http, в ответ на что...

Http-сервер: Как сделать чтоб этот сервер понимал файлы расширением .php и .aspx
Здравствуйте друзья Как сделать чтоб этот сервер понимал файлы расширением .php и .aspx? Простые странички он понимает нормально ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru