# ee_muduo_cpp11 **Repository Path**: leehaunan/ee_muduo_cpp11 ## Basic Information - **Project Name**: ee_muduo_cpp11 - **Description**: 参考muduo网络库,使用C++11标准编写的拥有非阻塞IO多路复用的TCP网络编程库,采用主从Reactor模式+线程池,实现了对网络编程接口的封装。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-02-21 - **Last Updated**: 2024-09-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ee_muduo_cpp11 ### 简单介绍 参考muduo网络库,使用C++11标准编写的拥有非阻塞IO多路复用的TCP网络编程库,采用主从Reactor模式+线程池,实现了对网络编程接口的封装。 ### 总述 muduo库是基于多Reactor-多线程模型实现的TCP网络编程库,性能良好。如libev作者:“One loop per thread is usually a good model”,muduo库的作者陈硕在其《Linux多线程服务端编程》中也力荐这种“One loop per thread”的IO模型,使我们仅需要关注EventLoop的设计与实现,然后每个线程run一个loop即可。
而在这个项目设计与实现中,主要涉及了以下模块:Channel、Poller、EventLoop、Thread、EventLoopThread、EventLoopThreadPool、Socket、Acceptor、Buffer、TcpConnection、TcpServer。
更多的详细内容发布在作者CSDN个人博客:https://blog.csdn.net/m0_75034791/article/details/136461263?spm=1001.2014.3001.5501 ### 安装教程 下载到文件夹后,sudo ./autobuild.sh,运行编译和安装脚本,相关头文件也会添加到系统路径。下面提供一个回射服务器的测试代码。
``` #include #include #include #include class EchoServer { public: EchoServer(EventLoop *loop, const InetAddress &addr, const std::string &name) : server_(loop, addr, name) , loop_(loop) { // 注册回调函数 server_.setConnectionCallback( std::bind(&EchoServer::onConnection, this, std::placeholders::_1) ); server_.setMessageCallback( std::bind(&EchoServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3) ); // 设置合适的loop线程数量 loopthread server_.setThreadNum(3); } void start() { server_.start(); } private: // 连接建立或者断开的回调 void onConnection(const TcpConnectionPtr &conn) { if (conn->connected()) { LOG_INFO("Connection UP : %s", conn->peerAddress().toIpPort().c_str()); } else { LOG_INFO("Connection DOWN : %s", conn->peerAddress().toIpPort().c_str()); } } // 可读写事件回调 void onMessage(const TcpConnectionPtr &conn, Buffer *buf, Timestamp time) { std::string msg = buf->retrieveAllAsString(); conn->send(msg); conn->shutdown(); // 写端 EPOLLHUP =》 closeCallback_ } EventLoop *loop_; TcpServer server_; }; int main() { EventLoop loop; InetAddress addr(8000); EchoServer server(&loop, addr, "EchoServer"); // Acceptor non-blocking listenfd create bind server.start(); // listen loopthread listenfd => acceptChannel => mainLoop => loop.loop(); // 启动mainLoop的底层Poller return 0; } ``` ### 参考资料 1. 《高性能服务结构设计思想——one-thread-one-loop》,张小方,CppGuide,https://mp.weixin.qq.com/s/tKJtdLtJVFt0HHYOs7IoMA 2. 《Linux多线程服务器编程:使用muduo C++网络库》,陈硕 3. 《Muduo网络库源代码分析:EventLoopThread和EventLoopThreadPool的封装》,blfbuaa,https://www.cnblogs.com/blfbuaa/p/7263398.html 4. 《图解操作系统》,小林coding,https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUxODAzNDg4NQ==&scene=1&album_id=1408057986861416450&count=3#wechat_redirect