Ú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
epollpara implementar o laço de eventos e gerenciar um grande número de conexões de clientes. Oepollé 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_waitnã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
SocketAwaitereAsyncSocketOperation, 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
fcntlpara colocar o socket em modo não bloqueante, garantindo que as operaçõesaccepteread/writenã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¶
- Escrevendo C++ FnOnce à mão | C++那些事
- Pequeno projeto de gRPC em C++ | C++那些事
- Comunicação entre processos em C++ na prática | C++那些事
- Demo de serviço de URL curta em C++ | C++那些事
- C++17 e SQLite para medir o tamanho de diretórios | C++那些事
- Testes de performance com Google Benchmark | C++那些事
- Serialização ZeroCopy com Protobuf | C++那些事
- Acelerando Python com pybind11 | C++那些事
- Projeto de calculadora em pilha em C++ | C++那些事