Ir para o conteúdo

Última atualização:2026-10-12

Servidor HTTP com corrotinas do C++20

Servidor HTTP em C++ moderno

Ultimamente, os participantes da planeta vivem me perguntando se tenho projetos relacionados a redes, então escrevi um projeto completo baseado em C++ moderno + gerenciado com CMake.

O projeto possui as seguintes características:

  • Muitos recursos do C++ moderno
  • Relacionados ao C++20
    • cortouine
    • concept
    • std::format
    • std::span
  • Relacionados ao C++17
    • inicialização em comandos if
    • structured bindings
    • optional
  • Mecanismo orientado a eventos eficiente
  • Usa epoll para implementar o laço de eventos e gerenciar um grande número de conexões de clientes. O epoll é uma ferramenta eficiente da plataforma Linux para tratar I/O de alta concorrência: ele pode monitorar simultaneamente eventos de vários descritores de arquivo, reduzindo efetivamente o custo das chamadas de sistema e aumentando a concorrência das operações de I/O.
  • O servidor monitora os eventos de conexão por meio de epoll_wait não bloqueante no laço de eventos principal, evitando o gargalo de desempenho do I/O bloqueante tradicional.
  • Corrotinas e programação assíncrona
  • Adota corrotinas do C++20 para simplificar a implementação de tarefas assíncronas, oferecendo uma escrita semelhante à do código síncrono e deixando a lógica mais clara. No projeto, os dados do cliente são lidos e escritos de forma assíncrona com co_await, reduzindo o custo da troca de contexto entre threads.
  • Implementa as classes SocketAwaiter e AsyncSocketOperation, usadas para encapsular as operações assíncronas de leitura e escrita do socket, tornando a escrita de código de tratamento assíncrono mais concisa e natural.
  • Tratamento assíncrono das operações de I/O de arquivos
  • O servidor dá suporte à leitura assíncrona do conteúdo de arquivos HTML, implementada com std::async, evitando bloquear a thread principal e respondendo mais rapidamente às requisições dos clientes.
  • No tratamento das requisições, os arquivos necessários são lidos de forma assíncrona e cacheados na memória, reduzindo o impacto das operações de I/O no desempenho.
  • Operações de socket não bloqueantes
  • Usa fcntl para colocar o socket em modo não bloqueante, garantindo que as operações accept e read/write não bloqueiem a thread principal do servidor. Isso é especialmente importante em cenários de alta concorrência e pode aumentar significativamente a capacidade de tratamento concorrente do servidor.

Resultado do projeto:

Forma de estudo: há documentação detalhada + código; pode ser comprado separadamente adicionando o WeChat abaixo, ou basta entrar na planeta.

Tópicos relacionados

Comentários