发布一个基于 Reactor 模式的 C++ 网络库
发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。 目录 由来 1 下载与编译 2 例子 2 基本结构 3 公开接口 4 内部实现 4 线程模型 5 结语 5 由来半年前我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子:
在想清楚这些目标之后,我开始第三次尝试编写自己的 C++ 网络库。与前两次不同,这次我一开始就想好了库的名字,叫 muduo (木铎),并在 Google code 上创建了项目: http://code.google.com/p/muduo/ 。muduo 的主体内容在 5 月底已经基本完成,现在我把它开源。 本文主要介绍 muduo 网络库的使用,其设计与实现将有另文讲解。 下载与编译下载地址: http://muduo.googlecode.com/files/muduo-0.1.0-alpha.tar.gz SHA1 Checksum: 5d3642e311177ded89ed0d15c10921738f8c984c Muduo 使用了 Linux 较新的系统调用,要求 Linux 的内核版本大于 2.6.28 (我自己用的是 2.6.32 )。在 Debian Squeeze / Ubuntu 10.04 LTS 上编译测试通过,32 位和 64 位系统都能使用。 Muduo 采用 CMake 为 build system,安装方法: $ sudo apt-get install cmake Muduo 依赖 Boost,很容易安装: $ sudo apt-get install libboost1.40-dev # 或 libboost1.42-dev 编译方法很简单: $ tar zxf muduo-0.1.0-alpha.tar.gz $ cd muduo/ $ ./build.sh # 编译生成的可执行文件和静态库文件分别位于 ../build/debug/{bin,lib} 如果要编译 release 版,可执行 $ BUILD_TYPE=release ./build.sh # 编译生成的可执行文件和静态库文件分别位于 ../build/release/{bin,lib} 编译完成之后请试运行其中的例子。比如 bin/inspector_test ,然后通过浏览器访问 http://10.0.0.10:12345/ 或 http://10.0.0.10:12345/proc/status,其中 10.0.0.10 替换为你的 Linux box 的 IP。 例子Muduo 附带了几十个小例子,位于 examples 目录。其中包括从 Boost.Asio、JBoss Netty、Python Twisted 等处移植过来的例子。 examples |-- simple # 简单网络协议的实现 | |-- allinone # 在一个程序里同时实现下面 5 个协议 | |-- chargen # RFC 864,可测试带宽 | |-- daytime # RFC 867 | |-- discard # RFC 863 | |-- echo # RFC 862 | |-- time # RFC 868 | `-- timeclient # time 协议的客户端 |-- hub # 一个简单的 pub/sub/hub 服务,演示应用级的广播 |-- roundtrip # 测试两台机器的网络延时与时间差 |-- asio # 从 Boost.Asio 移植的例子 | |-- chat # 聊天服务 | `-- tutorial # 一系列 timers |-- netty # 从 JBoss Netty 移植的例子 | |-- discard # 可用于测试带宽,服务器可多线程运行 | |-- echo # 可用于测试带宽,服务器可多线程运行 | `-- uptime # TCP 长连接 `-- twisted # 从 Python Twisted 移植的例子 `-- finger # finger01 ~ 07 基本结构Muduo 的目录结构如下。 muduo |-- base # 与网络无关的基础代码,已提前发布 `-- net # 网络库 |-- http # 一个简单的可嵌入的 web 服务器 |-- inspect # 基于以上 web 服务器的“窥探器”,用于报告进程的状态 `-- poller # poll(2) 和 epoll(4) 两种 IO multiplexing 后端 Muduo 是基于 Reactor 模式的网络库,其核心是个事件循环 EventLoop,用于响应计时器和 IO 事件。Muduo 采用基于对象(object based)而非面向对象(object oriented)的设计风格,其接口多以 boost::function + boost::bind 表达。 Muduo 的头文件明确分为客户可见和客户不可见两类。客户可见的为白底,客户不可见的为灰底。
这里简单介绍各个头文件及 class 的作用,详细的介绍留给以后的博客。 公开接口
内部实现
线程模型Muduo 的线程模型符合我主张的 one loop per thread + thread pool 模型。每个线程最多有一个 EventLoop。每个 TcpConnection 必须归某个 EventLoop 管理,所有的 IO 会转移到这个线程,换句话说一个 file descriptor 只能由一个线程读写。TcpConnection 所在的线程由其所属的 EventLoop 决定,这样我们可以很方便地把不同的 TCP 连接放到不同的线程去,也可以把一些 TCP 连接放到一个线程里。TcpConnection 和 EventLoop 是线程安全的,可以跨线程调用。TcpServer 直接支持多线程,它有两种模式: 1. 单线程,accept 与 TcpConnection 用同一个线程做 IO。 2. 多线程,accept 与 EventLoop 在同一个线程,另外创建一个 EventLoopThreadPool,新到的连接会按 round-robin 方式分配到线程池中。 结语Muduo 是我对常见网络编程任务的总结,用它我能很容易地编写多线程的 TCP 服务器和客户端。Muduo 是我业余时间的作品,代码估计还有很多 bug,功能也不完善(例如不支持 signal 处理),待日后慢慢改进吧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |