TinyWebServer
O servidor web leve C++ no Linux ajuda os iniciantes a praticar rapidamente a programação de rede e a construir seu próprio servidor.
- Modelo de simultaneidade usando pool de threads + soquete sem bloqueio + epoll (implementado por ET e LT) + processamento de eventos (implementado por Reactor e Proactor simulado)
- Use máquina de estado para analisar mensagens de solicitação HTTP, suporte à análise de solicitações GET e POST
- Acesse o banco de dados do servidor para implementar funções de registro e login de usuário da web e pode solicitar imagens do servidor e arquivos de vídeo
- Implementar sistema de log síncrono/assíncrono para registrar o status de execução do servidor
- Após o teste de estresse do Webbench , dezenas de milhares de trocas simultâneas de dados de conexão podem ser alcançadas
escreva na frente
- Durante o desenvolvimento e manutenção deste projeto, muitos calçados infantis receberam envelopes vermelhos para me apoiar, mas recusei todos. Não irei, nem irei no futuro, empacotar este projeto em nenhum curso para venda, nem abrirei nenhum canal de suporte.
- Atualmente, existem pessoas na Internet que empacotam este projeto ou o projeto de Youshuangdao em cursos para venda. Fique atento e identifique os projetos de servidor C++ dos principais sites de aprendizagem/procura de emprego e não pague cegamente.
- Um entrevistador sênior me encontrou na empresa por meio de informações do projeto e descobriu que muitos currículos de crianças utilizavam esse projeto. Porém, durante o processo de entrevista, descobri que
很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习
. .- "Programação Avançada em Ambiente Unix"
- "programação de rede unix"
- Obrigado a todos os chefes, amigos e calçados infantis pelo reconhecimento e apoio. Seria uma grande honra para mim se este projeto pudesse ajudá-lo a começar.
Índice
Visão geral | quadro | Demonstração | teste de estresse | Registro de alterações | Baixar código-fonte | Corra rapidamente | Operação personalizada | Cozinheiro Ding Jie Niu | Implementação CPP11 | Agradecimentos |
---|
Visão geral
- C/C++
- Modelo B/S
- Classe wrapper do mecanismo de sincronização de threads
- classe de processamento de solicitação de conexão http
- Pool de threads semissíncronos/semi-reator
- Temporizador para lidar com conexões inativas
- Sistema de registro síncrono/assíncrono
- Conjunto de conexões de banco de dados
- Registro de thread síncrono e verificação de login
- Teste de estresse de servidor simples
quadro
Demonstração
- Inscreva-se para uma demonstração
- Solicitar demonstração de arquivo de imagem (6M)
- Solicite demonstração de arquivo de vídeo (39M)
teste de estresse
Depois de fechar o log, use o Webbench para realizar um teste de estresse no servidor. Use os modos ET e LT para listenfd e connfd respectivamente. Ambos podem atingir dezenas de milhares de conexões simultâneas.
- Proator, LT + LT, 93251 QPS
- Proator, LT + ET, 97459 QPS
- Proator, ET + LT, 80498 QPS
- Proator, ET + ET, 92167 QPS
- Reator, LT + ET, 69175 QPS
- Número total de conexões simultâneas: 10.500
- Tempo de acesso ao servidor: 5s
- Todos os acessos foram bem-sucedidos
Nota: Ao usar o webbench deste projeto para testes de estresse, se uma mensagem de erro mostrar que o comando webbench não pode ser encontrado, exclua o arquivo executável webbench e recompile.
Registro de alterações
Baixar código-fonte
Existem atualmente duas versões. Existem grandes mudanças na estrutura do código entre as versões, e a documentação e os métodos de execução do código também são inconsistentes. A versão refatorada é mais concisa e a versão original (raw_version) é maior, mantendo o sabor original do código Youshuang, e é mais fácil começar com a versão original.
Se você encontrar uma falha ao baixar o código do github ou se o acesso for muito lento, você pode baixá-lo no link a seguir e sincronizá-lo com o envio mais recente do Github.
- Endereço de download da versão refatorada: BaiduYun
- Endereço de download da versão original (raw_version): BaiduYun
- Código de extração: 9wye
- Para executar a versão original, consulte a documentação original.
Corra rapidamente
Ambiente de teste do servidor
- Ubuntu versão 16.04
- MySQL versão 5.7.29
Ambiente de teste do navegador
- Windows e Linux estão disponíveis
- Cromo
- FireFox
- Ainda não há testes em outros navegadores
Certifique-se de que o banco de dados MySQL esteja instalado antes de testar
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user (
username char ( 50 ) NULL,
passwd char( 50 ) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user (username, passwd) VALUES( ' name ' , ' passwd ' );
Modifique as informações de inicialização do banco de dados em main.cpp
//数据库登录名,密码,库名
string user = " root " ;
string passwd = " root " ;
string databasename = " yourdb " ;
construir
Iniciar servidor
Lado do navegador
Operação personalizada
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
Lembrete caloroso: Os parâmetros acima não são necessários, você não precisa usar todos eles, você pode escolhê-los de acordo com sua situação pessoal.
- -p, número da porta personalizada
- -l, selecione o método de gravação de log, o padrão é gravação síncrona
- 0, escrita síncrona
- 1. Escrita assíncrona
- -m, combinação de modo de listenfd e connfd, o padrão é LT + LT
- 0, significa usar LT + LT
- 1, significa usar LT + ET
- 2, significa usar ET + LT
- 3, significa usar ET + ET
- -o, fecha a conexão normalmente, não usado por padrão
- -s, número de conexões de banco de dados
- -t, número de threads
- -c, feche o log, abra por padrão
- 0, abra o registro
- 1. Feche o registro
- -a, selecione o modelo do reator, o padrão é Proactor
- 0, modelo Proator
- 1. Modelo de reator
Teste exemplos de comandos e significados
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
Cozinheiro Ding Jie Niu
A iteração da versão recente é mais rápida e o conteúdo a seguir é baseado principalmente no código da versão antiga (raw_version) para explicação detalhada.
- A perspectiva de um novato: entenda o TinyWebServer do presidente em um artigo
- Explicação detalhada da versão mais recente do projeto de servidor Web - 01 Classe de encapsulamento do mecanismo de sincronização de threads
- Explicação detalhada da versão mais recente do projeto de servidor Web - 02 Conjunto de threads semi-reator semi-síncrono (Parte 1)
- Explicação detalhada da versão mais recente do projeto de servidor Web - 03 Conjunto de threads semi-reator semi-síncrono (Parte 2)
- Explicação detalhada da última versão do projeto de servidor Web - 04 processamento de conexão http (Parte 1)
- Explicação detalhada da última versão do projeto de servidor Web - 05 processamento de conexão http (Parte 2)
- Explicação detalhada da última versão do projeto de servidor Web - 06 processamento de conexão http (Parte 2)
- Explicação detalhada da última versão do projeto de servidor Web - 07 Processamento de timer de conexões inativas (Parte 1)
- Explicação detalhada da última versão do projeto de servidor Web - 08 Processamento de timer de conexões inativas (Parte 2)
- Explicação detalhada da versão mais recente do projeto de servidor Web - 09 Sistema de log (Parte 1)
- Explicação detalhada da versão mais recente do projeto de servidor Web - 10 Sistema de log (Parte 2)
- Explicação detalhada da versão mais recente do projeto de servidor Web - 11 Conjunto de conexões de banco de dados
- Explicação detalhada da versão mais recente do projeto de servidor Web - 12 Cadastre-se e faça login
- Explicação detalhada da versão mais recente do projeto de servidor Web – 13 armadilhas e perguntas da entrevista
- Atualizado
História das Estrelas
Implementação CPP11
Uma implementação CPP11 mais simples e elegante: Webserver
Agradecimentos
Programação de servidor Linux de alto desempenho, escrita por You Shuang.
Obrigado aos seguintes amigos por relações públicas e ajuda: @RownH, @mapleFU, @ZWiley, @zjuHong, @mamil, @byfate, @MaJun827, @BBLiu-coder, @smoky96, @yfBong, @liuwuyao, @Huixxi, @markparticle , @ blogg9ggg.