# simple-muduo **Repository Path**: canoe_lin/simple-muduo ## Basic Information - **Project Name**: simple-muduo - **Description**: No description available - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-07 - **Last Updated**: 2026-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Simple-Muduo 轻量级 C++ 网络库,参考 Muduo 设计思想,采用 Reactor 模式实现高性能 TCP 服务器。以**学习源码**为目标,按模块仿写。 ## 架构 - **TcpServer** — 高封装入口 - **Acceptor / Connection** — 连接接收与 TCP 连接管理 - **Timer** — 时间轮定时器 - **EventLoop** — Reactor 核心,one loop per thread - **Poller (epoll) / Channel** — IO 复用 + 事件分发 - **Socket / Buffer** — 底层封装 事件流转:`Poller` 监听 fd → `Channel` 分发 → `EventLoop` 执行回调 → `Connection` 处理业务 ## 模块 | 模块 | 状态 | 关键类 | |------|:----:|--------| | Buffer | ✅ | `Buffer` | | Socket | ✅ | `Socket` | | Channel | ✅ | `Channel` | | Poller | ✅ | `Poller` | | EventLoop | ✅ | `EventLoop` | | Timer | ✅ | `Timer`, `TimerTask` | | Connection | ✅ | `Connection` | | Acceptor | ✅ | `Acceptor` | | EventLoopThread | ✅ | `EventLoopThread` | | EventLoopThreadPool | ✅ | `EventLoopThreadPool` | | TcpServer | ✅ | `TcpServer` | | Log | ✅ | `Logger`, `LogLevel` | ## 模块示例 ### Buffer — 用户态缓冲区 ```cpp buf.Append(data, len); buf.Append(data); auto view = buf.Peek(); buf.Retrieve(view.size()); ``` ### Socket — RAII 套接字封装 ```cpp Socket server; server.CreateServer(8080); // 一键创建服务端 int client_fd = server.Accept(); // 接受连接 Socket client; client.CreateClient(8080, "127.0.0.1"); // 一键创建客户端 client.Send("hello", 5); ``` ### Channel — 对文件描述符进行监控事件管理 ```cpp Channel ch(sockfd); ch.setReadCallback([](){ ... }); ch.EnableRead(); ``` ### EventLoop — Reactor 事件循环核心 ```cpp EventLoop loop; // 启动事件循环(阻塞当前线程) loop.Loop(); // 跨线程投递任务 loop.RunInLoop([]() {/* 在事件循环线程安全执行 */}); // 停止事件循环 loop.Quit(); ``` ### Timer — 时间轮定时器 ```cpp EventLoop loop; // 定时器:id=1001, 5 秒后触发一次 loop.AddTimer(1001, 5, [&]() { printf("timer fired\n"); loop.Quit(); }); loop.Loop(); ``` ### Acceptor — 连接接收器 ```cpp Acceptor acceptor(&loop, 8080); acceptor.setAcceptCallback([&](int fd) { // 创建 Connection 管理新接受的 fd }); // Acceptor 构造时自动注册到 EventLoop ``` ### EventLoopThread — 独立事件循环线程 ```cpp EventLoopThread thread; EventLoop* loop = thread.StartLoop(); // 等待子线程 EventLoop 就绪 // loop 可在主线程安全投递任务 loop->RunInLoop([]() { printf("在子线程执行\n"); }); // 析构时自动 Quit + join ``` ### EventLoopThreadPool — 事件循环线程池 ```cpp EventLoop base_loop; EventLoopThreadPool pool(&base_loop); pool.setThreadNum(4); pool.Start(); // Round-Robin 分配 for (int i = 0; i < 10; ++i) { EventLoop* loop = pool.GetNextLoop(); printf("loop %d\n", i); } ``` ### Connection — TCP 连接管理 ```cpp std::shared_ptr conn = std::make_shared(&loop, id, fd); conn->setConnectedCallback([](const auto& c) { printf("connected: %lu\n", c->Id()); }); conn->setMessageCallback([](const auto& c, Buffer* buf) { printf("recv: %.*s\n", (int)buf->ReadAbleSize(), buf->ReadPosition()); c->Send("pong", 4); }); conn->setClosedCallback([](const auto& c) { printf("closed: %lu\n", c->Id()); }); conn->EnableInactiveRelease(30); // 30 秒无通信自动销毁 conn->Established(); // 注册事件回调,开始通信 ``` ### TcpServer — TCP 服务端封装 ```cpp EventLoop loop; TcpServer server(&loop, 8080); server.setMessageCallback([](const auto& conn, Buffer* buf) { printf("recv: %s\n", buf->Peek().data()); buf->RetrieveAll(); }); server.Start(); loop.Loop(); ``` ### 日志 ```cpp INFO("server started on port {}", 8080); ERROR("connection refused: {}", errno); WARNING("high memory usage"); ``` 默认打印 INFO 及以上。启动时加 `--debug` 显示 DEBUG 级别: ```bash ./http_server --debug ``` ## 快速开始 环境:Linux + CMake 3.28+ + GCC 14+ (C++23) ```bash cd simple-muduo mkdir build && cd build cmake .. make -j$(nproc) # 安装到系统路径 sudo make install # 头文件 → /usr/local/include/simple_muduo/ # 库 → /usr/local/lib/simple_muduo/lib/ ``` 运行测试: | 可执行文件 | 模块 | |---------------------|:--------:| | test/module/tlog | Logger | | test/module/tbuffer | Buffer | | test/module/tsocket | Socket | | test/module/teventloop | EventLoop | | test/module/tcp_srv | TCP 服务端(综合)| | test/module/tcp_cli | TCP 客户端(综合)| ## 目录结构 ```text ├── CMakeLists.txt ├── log # 日志模块 │ ├── log.cc │ └── log.h ├── net # 网络模块 │ ├── buffer.h / .cc # 用户态缓冲区 │ ├── socket.h / .cc # 套接字 RAII 封装 │ ├── channel.h / .cc # fd 事件通道 │ ├── poller.h / .cc # epoll 多路复用 │ ├── event_loop.h / .cc # Reactor 事件循环 │ ├── timer.h / .cc # 时间轮定时器 │ ├── connection.h / .cc # TCP 连接管理 │ ├── acceptor.h / .cc # 连接接收器 │ ├── event_loop_thread.h / .cc # 独立事件循环线程 │ ├── event_loop_threadpool.h/.cc # 事件循环线程池 │ └── tcp_server.h / .cc # TCP 服务端封装 ├── http # HTTP 应用(独立项目) ├── test │ ├── general # 通用 API 练习 │ └── module # 模块测试 └── examples # 示例程序 ``` ## 参考资料 - Muduo 源码 https://github.com/chenshuo/muduo - 《Linux 多线程服务端编程》https://book.douban.com/subject/20471211/