# mymuduo **Repository Path**: Saborking/mymuduo ## Basic Information - **Project Name**: mymuduo - **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-30 - **Last Updated**: 2025-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](重写muduo库-代码实现) 要复现并优化muduo库,至少你得会用muduo库吧,连使用都不熟悉,又谈何根据源码进行复现呢? # muduo库的安装与使用 ## muduo库的安装(测试通过) 安装步骤简要说明: 3. 首先需要安装boost库(muduo的依赖库) 4. 下载muduo源码 5. 使用cmake进行编译安装 这里提供几个博客供大家参考安装,linux环境可以使用虚拟机或者购买一个云服务器(推荐,附一个链接[阿里云](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob),[腾讯云](https://cloud.tencent.com/act?s_refer=https://www.yuque.com/#all)): - [Linux平台下muduo网络库源码编译安装](https://cloud.tencent.com/developer/article/1879318) - [Linux平台下muduo网络库源码编译安装与测试,包含boost库的安装与测试!!!!](https://blog.csdn.net/m0_73537205/article/details/138353805) - [Linux下源码安装Boost库-apt](https://blog.csdn.net/RadiantJeral/article/details/112757233) - [Linux下源码安装Boost库-yum](https://blog.csdn.net/sinat_36528886/article/details/138602830) - boost环境命令更新-yum ```cpp # 安装Python 3.11及开发工具 yum -y install gcc gcc-c++ python3.11 python3.11-devel libicu libicu-devel zlib zlib-devel bzip2 bzip2-devel # 验证安装 python3.11 --version ``` 验证安装 `python3.11 --version` 云服务器上可能遇到的问题: 如果是2核2G的服务器,大概率是会遇到安装boost库是内存使用率过高导致断连的问题,有两个方案 1. 升级服务器配置 2. [设置swap分区大小](https://blog.csdn.net/weixin_44796670/article/details/121234446) ## muduo库的使用(测试通过) 使用muduo库需要编写C++代码(可使用vscode远程连接到服务器进行开发)。以下是一个简单的echo服务器示例:(问题 cursor 不能使用c/c++ 插件,使用vscode可以避免) ```cpp /* *muduo网络库给用于提供了两个类 * TcpServer : 用于创建tcp服务器, * TcpClient : 用于创建tcp客户端 * epoll + 线程池 * 好处: 能够把网络I/O的代码和业务代码区分开 * 只关心: 用户的连接和断开 用户的可读写事件 */ #include // 用于时间处理 #include #include #include #include #include using namespace std; using namespace muduo; using namespace muduo::net; /* * 基于muduo网络库开发服务器程序 *1. 组合TcpServer *2. 创建EventLoop事件循环对象的指针 *3. 明确TcpServer构造函数需要什么参数, 输出ChatServer的构造函数 *4. 在当前服务器类的构造函数中,注册用户连接和断开的回调函数 *5. 设置服务器端的线程数量 */ class ChatServer { public: ChatServer(EventLoop *loop, // 事件循环 const InetAddress &listenAddr, // IP + Port const string &nameArg) // 服务器的名字 : server_(loop, listenAddr, nameArg), loop_(loop) { // 给服务器注册用户连接的创建和断开回调 server_.setConnectionCallback( std::bind(&ChatServer::onConnection, this, std::placeholders::_1)); // 给服务器注册用户读写事件回调 server_.setMessageCallback( std::bind(&ChatServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); // 设置服务器端的线程数量 1个I/O线程 3个worker线程 server_.setThreadNum(4); } // 开启事件循环 void start() { server_.start(); } private: TcpServer server_; // #1 EventLoop *loop_; // # 2 // 专门处理用户的连接和断开 conn是用户的连接 // 需要的是用户的连接和断开事件回调 void onConnection(const TcpConnectionPtr &conn) { if (conn->connected()) { cout << conn->peerAddress().toIpPort() << "->" << conn->localAddress().toIpPort() << "state:online" << endl; } else { cout << conn->peerAddress().toIpPort() << "->" << conn->localAddress().toIpPort() << "state:offline" << endl; } } // 专门处理用户的可读写事件 conn是用户的连接 需要的是用户的可读写事件回调 void onMessage(const TcpConnectionPtr &conn, // 用户的连接 Buffer *buf, // 缓冲区 Timestamp time) // 接受到数据的时间信息 { // 打印用户发送的信息 string msg = buf->retrieveAllAsString(); // 将time转为字符串并格式化 char timeStr[32]; time_t seconds = time.secondsSinceEpoch(); struct tm *tm_time = localtime(&seconds); strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_time); cout << "recv data:" << msg << " time:" << timeStr << endl; // 给用户发送数据 回显 conn->send(msg); } }; int main() { EventLoop loop;//epoll InetAddress addr("127.0.0.1", 6000); ChatServer server(&loop, addr, "ChatServer"); server.start(); loop.loop(); return 0; } ``` 编译命令: ```bash g++ echo.cpp -o echo -lmuduo_net -lmuduo_base -lpthread ``` 在终端中运行`./echo`,并在另一个终端测试连接`telnet 127.0.0.1 6000` # 代码复现 完整复现代码所在仓库地址:[mymuduo](https://github.com/your-username/mymuduo) 以下详细说明各个核心模块的实现: ## 目录结构 ``` mymuduo/ ├── CMakeLists.txt ├── include/ │ ├── Channel.h │ ├── EventLoop.h │ ├── Poller.h │ ├── EPollPoller.h │ ├── Thread.h │ ├── EventLoopThread.h │ ├── EventLoopThreadPool.h │ ├── Socket.h │ ├── Acceptor.h │ ├── Buffer.h │ ├── TcpConnection.h │ └── TcpServer.h └── src/ ├── Channel.cc ├── EventLoop.cc └── ... (对应的源文件) ``` ## CMakeLists.txt CMakeLists.txt 是项目的构建配置文件,主要完成: - 设置项目名称和版本 - 设置编译选项 - 设置输出路径 - 添加源文件 - 生成动态库 ## Channel Channel 是核心类之一,负责: - 封装文件描述符 - 保存事件相关的回调函数 - 设置/获取事件状态 - 处理事件分发 ## Poller和EPollPoller-Demultiplex - Poller 是抽象基类,定义了IO多路复用的接口 - EPollPoller 是基于epoll的具体实现,主要功能: - 创建epoll实例 - 添加/修改/删除监听事件 - 等待事件发生并返回活跃事件 ## Thread和EventLoopThread - Thread 封装了线程的创建与管理 - EventLoopThread 是运行事件循环的线程类,实现: - 创建新线程 - 在新线程中运行事件循环 - 等待事件循环启动完成 ## EventLoopThreadPool 线程池类,管理多个 EventLoopThread: - 创建指定数量的 EventLoopThread - 实现 Round-Robin 方式的线程选择 - 启动/停止所有事件循环线程 ## Socket 封装 socket 相关操作: - 创建监听 socket - 绑定地址 - 监听连接 - 接受新连接 - 关闭连接 ## Acceptor 接受器类,用于接受新的 TCP 连接: - 创建监听 socket - 绑定接受连接的回调函数 - 处理新连接的建立 ## Buffer 缓冲区类,实现: - 可动态扩容的缓冲区 - 数据的读写操作 - 搜索和提取数据的方法 ## TcpConnection TCP 连接类,表示一个 TCP 连接: - 管理连接状态 - 处理数据的收发 - 管理连接的生命周期 - 处理各种回调事件 ## TcpServer TCP 服务器类,提供完整的服务器功能: - 接受新连接 - 管理所有 TCP 连接 - 处理连接的建立和断开 - 分发消息到业务处理函数 # 优化方向 1. 内存池优化:使用内存池管理小对象的分配 2. 智能指针优化:使用 `std::unique_ptr` 和 `std::shared_ptr` 管理资源 3. 定时器优化:使用时间轮算法优化定时器性能 4. 日志系统优化:实现异步日志 5. 线程池优化:实现可动态调整的线程池