一个为了“极致性能”和“优雅开发体验”而生的 C 语言 Web 服务器框架。
它不仅仅是一个玩具 demo,更是一个尝试还原 Nginx/Redis 核心高并发模型(Reactor)、具备完整 HTTP 协议解析、JWT 安全认证、动态路由分发能力的微型服务器框架。
现在,它更进化到了一个新的阶段:拥有了现代化的 Response 封装、自动参数解析和原生 JSON 支持。
本项目采用了经典的 Library + Application 分离架构,实现了核心引擎与业务逻辑的解耦。
epoll_server_core/(The Engine): 底层核心库。- 职责: 封装 Socket/Epoll、HTTP 状态机解析、路由分发、日志系统、参数预解析、JSON 解析。
- 产物:
libwebserver.a静态库。
user_backend/(The App): 上层业务应用与前端演示。- 职责: 定义业务 API(登录/注册/搜索/JSON Echo/计算器/系统信息)、提供静态前端(含
/demo.html全功能演示)。 - 产物:
server_app可执行文件。
- 职责: 定义业务 API(登录/注册/搜索/JSON Echo/计算器/系统信息)、提供静态前端(含
我们拒绝传统的“多线程阻塞”模型。本项目采用 单线程 Reactor 模式 + 非阻塞 I/O + Epoll (Edge Triggered)。
- 优势: 消除线程上下文切换开销,单核即可支撑数万并发连接。
- 实现: 主循环只负责事件分发,业务逻辑通过回调处理。
TCP 传输中“粘包”和“半包”是常态。我们手写了一个鲁棒的有限状态机 (FSM)。
- 增量解析: 哪怕数据分十次到达,状态机也能记住上次解析的位置(
REQ_LINE->HEADERS->BODY),无缝拼接请求。 - 零阻塞: 解析过程中任何时候数据不足,立即返回,绝不阻塞线程。
- Access Log: 记录标准 HTTP 请求日志。
- System Log: 记录内核调试信息。
- 启动缓冲 (Log Buffer): 即使在配置文件加载前的启动初期,日志也会被暂存在内存中,待配置加载后自动回放写入文件,确保零丢失。
内置 l8w8jwt 库,提供标准的 Authorization: Bearer <token> 验证机制。实现无状态的用户鉴权,适合分布式扩展。
谁说写 C 语言 Web 后端一定很痛苦?看看我们的新特性:
- 告别手动
free: 请求参数(Query/Form)自动解析并绑定生命周期,用完即走。 - 原生 JSON 支持: 集成高性能 yyjson 库。请求体自动解析为文档,响应体一行代码直接发送文档。
- 优雅的 Response API: 无论是极速发送
http_send_json还是精细控制 Header,都得心应手。 - Request/Response 封装:
HttpRequest自动预解析 Query/Form/JSON;HttpResponse既可一行返回(http_send_*),也可手术刀式定制 Header/Body。
现代服务器的标配。我们不仅支持长连接(Keep-Alive),还攻克了高难度的 Pipeline(管线化)支持。
- 内存安全: 实现了 "Save & Restore" 机制,防御了 Pipeline 场景下缓冲区边界破坏 (Off-by-one) 问题。
- 高吞吐: 实测单线程压测 QPS 突破 2.3 万。
- 详情: 请参考设计文档 DESIGN_KEEP_ALIVE.md。
因为使用了 submodule 管理核心库,请务必使用递归克隆:
git clone --recursive https://github.com/William-2025/School_Project_Week3.git
cd School_Project_Week3(如果忘记加 --recursive,请执行 git submodule update --init --recursive)
本项目依赖 OpenSSL 和 libk (用于 JWT 库)。
-
Linux (Ubuntu/Debian):
sudo apt-get install libssl-dev
-
yyjson: 高性能 JSON 库
yyjson的源码已经包含在epoll_server_core/deps/yyjson中。 如果你的deps目录为空,请检查是否执行了git submodule update --init --recursive。
注意:所有编译和运行操作都在 user_backend 目录下进行,这会自动触发核心库的编译。
# 进入业务后端目录
cd user_backend
# 增量编译
make
# 或全量重建(含核心库)
make rebuild
# 启动服务器(推荐传配置文件)
./bin/server_app conf/server.conf看到如下日志说明启动成功:
[INFO] Server starting on port 8888...
打开浏览器访问:
http://localhost:8888首页http://localhost:8888/demo.html全功能 API 演示页(推荐)
为了证明服务器在极端条件下的鲁棒性,我们提供了一个专业的 Python 验证脚本。该脚本会一次性向服务器发送 3 个粘连在一起的 HTTP 请求,并验证服务器能否正确解析并依次返回 3 个响应。
# 确保服务器正在后台运行 (端口 8888)
# 在项目根目录下执行:
python3 test_script/test_pipeline.py预期输出:
✅ SUCCESS: Pipeline working perfectly! Server handled 3 requests back-to-back.
你可以查看 user_backend/log/system.log (配置为 DEBUG 级别时),观察服务器如何通过 "Pipeline detected!" 日志来处理这些并发请求。
我们准备了极其详尽的文档,满足不同层次的需求:
-
📖 开发者手册 (User Guide)
(强烈推荐) 如果你是来使用这个框架写业务的,看这里!包含了如何构建、配置、使用 API、解析 JSON 等保姆级教程。 -
🏗️ 架构与设计 (Architecture)
如果想深入理解 Epoll 循环、状态机原理、或者想学习如何设计一个 C 语言库,请阅读这篇源码级剖析。 -
旧版本概述.md 这篇旧版本概述,写于请求结构体自动解码、Response结构体设计、优雅Response函数实现、yyjson集成之前。但通过阅读它,依旧可以了解到项目的具体架构和一些核心的实现思路。



