# TinyWebServer(C++高并发服务器) **Repository Path**: kkkred/TinyWebServer ## Basic Information - **Project Name**: TinyWebServer(C++高并发服务器) - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-24 - **Last Updated**: 2025-06-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TinyWebServer(C++高并发服务器)学习历程文档 ## 介绍 在学习C++高并发服务器开发过程中,我选择了qinguoyi的[TinyWebServer](https://github.com/qinguoyi/TinyWebServer)项目作为实践对象。通过这个项目,我深入理解了: - Linux下TCP/IP网络编程核心概念 - Reactor事件处理模式实现原理 - 线程池设计与任务调度机制 - HTTP协议解析与响应生成 - 数据库连接池性能优化技巧 ## 项目博客 https://blog.csdn.net/weixin_58163355/category_12979749.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12979749&sharerefer=PC&sharesource=weixin_58163355&sharefrom=from_link ## 软件架构 ```mermaid graph TD A[主线程] --> B[事件监听] B --> C[Epoll事件分发] C --> D[HTTP连接类] D --> E[线程池] E --> F[任务队列] F --> G[工作线程] G --> H[数据库连接池] G --> I[日志系统] ``` **核心组件学习笔记:** 1. **并发模型**:基于Reactor模式,主线程负责I/O事件监听,工作线程处理业务逻辑 2. **线程池**:固定数量线程+任务队列,避免频繁创建销毁线程 3. **连接管理**: - 使用`std::map`存储HTTP连接对象 - 支持长连接的定时器管理 4. **数据库池**: - RAII模式管理MySQL连接 - 支持连接复用和超时回收 5. **HTTP解析**: - 有限状态机解析请求行/头 - 支持GET/POST方法处理 ## 安装教程 ### 环境配置(踩坑记录) ```bash # 必要依赖 sudo apt-get install cmake g++ libmysqlclient-dev # 数据库配置(关键步骤) mysql> CREATE DATABASE webserver; mysql> USE webserver; mysql> CREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, username CHAR(50) NOT NULL, passwd CHAR(50) NOT NULL ); # 编译过程 mkdir build && cd build cmake .. make -j4 # 使用4核编译加速 # 常见错误解决: # 1. 找不到mysql.h:确认libmysqlclient-dev已安装 # 2. 链接失败:检查CMakeLists.txt中的库路径 ``` ## 使用说明 ### 服务器启动参数 ```bash ./TinyWebServer [-p port] [-d DAO模式] [-o 日志等级] # 示例: ./TinyWebServer -p 9006 -d 1 -o 2 ``` ### 压力测试(学习验证) 使用Webbench进行并发测试: ```bash # 安装测试工具 sudo apt install ctags git clone https://github.com/EZLippi/WebBench cd WebBench && make # 执行测试(模拟5000客户端,30秒) ./webbench -c 5000 -t 30 http://localhost:9006/ ``` ### 性能优化对比 | 优化项 | QPS提升 | CPU占用下降 | |----------------|---------|------------| | 基础版本 | 基准 | 基准 | | +线程池(8线程) | 220% | 35% | | +数据库连接池 | 150% | 41% | | +异步日志 | 18% | 27% | ## 学习心得 通过本项目实践,掌握了: 1. Epoll的ET/LT模式选择及注意事项 2. 智能指针在连接管理中的应用 3. 环形缓冲区设计减少内存拷贝 4. 条件变量实现精确唤醒机制 5. SIGPIPE信号处理避免服务崩溃 ## 参与贡献 欢迎通过以下方式参与改进: 1. 提交Issue讨论技术问题 2. 通过Pull Request贡献代码 3. 完善项目文档 **贡献流程:** ```mermaid sequenceDiagram 贡献者->>Fork仓库: 创建个人分支 贡献者->>本地开发: 在Feat_xxx分支编码 贡献者->>GitHub: 发起Pull Request 维护者->>代码审查: 审核+测试 维护者->>主仓库: 合并提交 ``` **具体步骤:** 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request > 学习提示:建议从连接管理模块开始阅读源码,逐步扩展到线程池和数据库池的实现,最后研究HTTP解析状态机