Перейти к содержанию

Последнее обновление: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 ниже, или присоединиться к закрытому сообществу.

Похожие темы

Комментарии