Последнее обновление:2026-10-12
HTTP-сервер на корутинах C++20¶
HTTP-сервер на современном C++¶
В последнее время участники закрытого сообщества всё время спрашивают меня о сетевых проектах, поэтому я написал полный проект на современном C++ под управлением CMake.
Проект обладает следующими особенностями:
- Множество возможностей современного C++
- Относящиеся к C++20
- cortouine
- concept
- std::format
- std::span
- Относящиеся к C++17
- инициализация в операторе if
- структурированные привязки
- optional
- Эффективный событийно-ориентированный механизм
- Событийный цикл реализован на
epollдля управления большим числом клиентских соединений.epoll— эффективный инструмент обработки высокопараллельного I/O на платформе Linux: он может одновременно отслеживать события множества файловых дескрипторов, тем самым заметно снижая накладные расходы на системные вызовы и повышая конкурентность операций I/O. - Сервер отслеживает события соединений через неблокирующий
epoll_waitв главном событийном цикле, что позволяет избежать узких мест производительности, свойственных традиционному блокирующему I/O. - Корутины и асинхронное программирование
- Используются корутины C++20 для упрощения реализации асинхронных задач; стиль написания близок к синхронному коду, благодаря чему логика становится яснее. В проекте чтение и запись данных клиента выполняются асинхронно через
co_await, что снижает накладные расходы на переключение контекста потоков. - Реализованы два класса —
SocketAwaiterиAsyncSocketOperation— для инкапсуляции асинхронных операций чтения/записи сокета, что делает написание асинхронного кода более лаконичным и естественным. - Асинхронная обработка файлового I/O
- Сервер поддерживает асинхронное чтение содержимого HTML-файлов; асинхронное чтение файлов реализовано через
std::async, что не блокирует главный поток и позволяет быстрее отвечать на клиентские запросы. - При обработке запроса нужные файлы читаются асинхронно и кэшируются в памяти, что снижает влияние операций I/O на производительность.
- Неблокирующие операции с сокетами
- С помощью
fcntlсокет переводится в неблокирующий режим, чтобы операцииacceptиread/writeне блокировали главный поток сервера. Это особенно важно в сценариях высокой конкурентности и позволяет заметно повысить пропускную способность сервера.
Результат работы проекта:
Способ изучения: есть подробная документация + код; можно купить отдельно, добавившись в WeChat ниже, или присоединиться к закрытому сообществу.
Похожие темы¶
- Пишем C++ FnOnce вручную | C++那些事
- Небольшой проект на C++ gRPC | C++那些事
- Межпроцессное взаимодействие в C++ на практике | C++那些事
- Демо сервиса коротких ссылок на C++ | C++那些事
- C++17 и SQLite: подсчёт размера каталога | C++那些事
- Тестирование производительности Google Benchmark | C++那些事
- Сериализация Protobuf ZeroCopy | C++那些事
- Ускорение Python с помощью pybind11 | C++那些事
- Проектирование стекового калькулятора на C++ | C++那些事