Chinaunix首页 | 论坛 | 博客
  • 博客访问: 859125
  • 博文数量: 1384
  • 博客积分: 27795
  • 博客等级: 上将
  • 技术积分: 16887
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-12 09:28
个人简介

只是心态,抓住机会。

文章分类

全部博文(1384)

文章存档

2014年(3)

2013年(403)

2012年(978)

分类: C/C++

2014-01-29 19:08:36

发布一个基于 Reactor 模式的 C++ 网络库
http://blog.csdn.net/solstice/article/details/5848547

分类: muduo c++ 多线程 26141人阅读 评论(84) 举报

目录(?)[+]

发布一个基于 Reactor 模式的 C++ 网络库

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

2010 Aug 30

本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。

目录

由来 1

下载与编译 2

例子 2

基本结构 3

公开接口 4

内部实现 4

线程模型 5

结语 5

由来

半年前我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子:

  • 线程安全,支持多核多线程
  • 不考虑可移植性,不跨平台,只支持 Linux,不支持 Windows。
  • 在不增加复杂度的前提下可以支持 FreeBSD/Darwin,方便将来用 Mac 作为开发用机,但不为它做性能优化。也就是说 IO multiplexing 使用 poll 和 epoll。
  • 主要支持 x86-64,兼顾 IA32
  • 不支持 UDP,只支持 TCP
  • 不支持 IPv6,只支持 IPv4
  • 不考虑广域网应用,只考虑局域网
  • 只支持一种使用模式:non-blocking IO + one event loop per thread,不考虑阻塞 IO
  • API 简单易用,只暴露具体类和标准库里的类,不使用 non-trivial templates,也不使用虚函数
  • 只满足常用需求的 90%,不面面俱到,必要的时候以 app 来适应 lib
  • 只做 library,不做成 framework
  • 争取全部代码在 5000 行以内(不含测试)
  • 以上条件都满足时,可以考虑搭配 Google Protocol Buffers RPC

在想清楚这些目标之后,我开始第三次尝试编写自己的 C++ 网络库。与前两次不同,这次我一开始就想好了库的名字,叫 muduo (木铎),并在 Google code 上创建了项目: 。muduo 的主体内容在 5 月底已经基本完成,现在我把它开源。

本文主要介绍 muduo 网络库的使用,其设计与实现将有另文讲解。

下载与编译

下载地址:

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 ,然后通过浏览器访问 或 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 的作用,详细的介绍留给以后的博客。

公开接口
  • Buffer 仿 Netty ChannelBuffer 的 buffer class,数据的读写透过 buffer 进行
  • InetAddress 封装 IPv4 地址 (end point),注意,muduo 目前不能解析域名,只认 IP
  • EventLoop 反应器 Reactor,用户可以注册计时器回调
  • EventLoopThread 启动一个线程,在其中运行 EventLoop::loop()
  • TcpConnection 整个网络库的核心,封装一次 TCP 连接
  • TcpClient 用于编写网络客户端,能发起连接,并且有重试功能
  • TcpServer 用于编写网络服务器,接受客户的连接
  • 在这些类中,TcpConnection 的生命期依靠 shared_ptr 控制(即用户和库共同控制)。Buffer 的生命期由 TcpConnection 控制。其余类的生命期由用户控制。
  • HttpServer 和 Inspector,暴露出一个 http 界面,用于监控进程的状态,类似于 Java JMX。这么做的原因是,《程序员修炼之道》第 6 章第 34 条提到“对于更大、更复杂的服务器代码,提供其操作的内部试图的一种漂亮技术是使用内建的 Web 服务器”,Jeff Dean 也说“(每个 Google 的服务器进程)Export HTML-based status pages for easy diagnosis”。
内部实现
  • Channel 是 selectable IO channel,负责注册与响应 IO 事件,它不拥有 file descriptor。它是 Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成员,生命期由后者控制。
  • Socket 封装一个 file descriptor,并在析构时关闭 fd。它是 Acceptor、TcpConnection 的成员,生命期由后者控制。EventLoop、TimerQueue 也拥有 fd,但是不封装为 Socket。
  • SocketsOps 封装各种 sockets 系统调用。
  • EventLoop 封装事件循环,也是事件分派的中心。它用 eventfd(2) 来异步唤醒,这有别于传统的用一对 pipe(2) 的办法。它用 TimerQueue 作为计时器管理,用 Poller 作为 IO Multiplexing。
  • Poller 是 PollPoller 和 EPollPoller 的基类,采用“电平触发”的语意。它是 EventLoop 的成员,生命期由后者控制。
  • PollPoller 和 EPollPoller 封装 poll(2) 和 epoll(4) 两种 IO Multiplexing 后端。Poll 的存在价值是便于调试,因为 poll(2) 调用是上下文无关的,用 strace 很容易知道库的行为是否正确。
  • Connector 用于发起 TCP 连接,它是 TcpClient 的成员,生命期由后者控制。
  • Acceptor 用于接受 TCP 连接,它是 TcpServer 的成员,生命期由后者控制。
  • TimerQueue 用 timerfd 实现定时,这有别于传统的设置 poll/epoll_wait 的等待时长的办法。为了简单起见,目前用链表来管理 Timer,如果有必要可改为优先队列,这样复杂度可从 O(n) 降为O(ln n) (某些操作甚至是 O(1))。它是 EventLoop 的成员,生命期由后者控制。
  • EventLoopThreadPool 用于创建 IO 线程池,也就是说把 TcpConnection 分派到一组运行 EventLoop 的线程上。它是 TcpServer 的成员,生命期由后者控制。

类图
muduo_class_diagram

线程模型

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 处理),待日后慢慢改进吧。

 

后记:性能测试:

1. muduo 与 boost asio 吞吐量对比

2. muduo 与 libevent2 吞吐量对比

3. 击鼓传花:对比 muduo 与 libevent2 的事件处理效率

更多 0
查看评论
51楼 zzh442856860 2013-12-01 23:33发表 [回复] ubuntu server 12.04 64bit,终于安装muduo成功了。 50楼 zzh442856860 2013-11-30 15:10发表 [回复] 有木有ubuntu12.04 64位系统的,
安装muduo的步骤啊,发现0.9.5加了一些东西 49楼 zzh442856860 2013-11-30 15:04发表 [回复] 执行./build.sh -j2,出现这个提示
-- Could NOT find Threads (missing: Threads_FOUND)
-- not found tcmalloc 48楼 kyee 2013-11-25 17:01发表 [回复] 我的通讯接口封装得更加彻底, 可以看下我的博文: http://blog.csdn.net/kyee/article/details/11615575,
RC3.0(跨平台, linux/windows互通)下载地址:
RC4.0(目前只支持windows)下载地址:: 47楼 eicesoft 2013-08-27 11:06发表 [回复] 为什么我编译出来没有相关库的so文件 只有一些.o静态库文件. Re: 陈硕 2013-08-27 12:20发表 [回复] 回复eicesoft:有 .a 库文件。 Re: eicesoft 2013-09-05 22:55发表 [回复] 回复Solstice:非常感谢回复, 之前的问题已经解决. 46楼 freeboy1015 2013-06-13 16:57发表 [回复] 报的错误如下:
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name. Re: freeboy1015 2013-06-13 17:07发表 [回复] 回复freeboy1015:已解决,需要安装g++,哈哈 45楼 freeboy1015 2013-06-13 16:42发表 [回复] 我下载的版本是0.9.3,照着你的方法编译安装后并没有生成 ../build/debug/{bin,lib},只生成了 ../build/debug/{CMakeCache.txt, CMakeFiles, muduo, examples},什么情况? 44楼 freeboy1015 2013-06-13 16:42发表 [回复] 我下载的版本是0.9.3,照着你的方法编译安装后并没有生成 ../build/debug/{bin,lib},只生成了 ../build/debug/{CMakeCache.txt, CMakeFiles, muduo, examples},什么情况? 43楼 tianyou121 2013-05-17 22:55发表 [回复] 你好,我编译muduo-0.8.2代码每次都会出现:sudoku.proto:2:8: Option "cc_generic_services" unknown.
make[2]: *** [examples/protobuf/rpc/sudoku.pb.cc] Error 1
make[1]: *** [examples/protobuf/rpc/CMakeFiles/sudoku_proto.dir/all] Error 2

gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
内核:System.map-2.6.32-24-generic

求解??? Re: 陈硕 2013-05-18 01:19发表 [回复] 回复tianyou121:要么安装 protobuf 2.4.1,要么去掉 generic_services 这几行。 Re: tianyou121 2013-05-18 10:24发表 [回复] 回复Solstice:谢谢啦 42楼 voidccc 2013-05-17 13:05发表 [回复] 博主您好,个人觉得muduo是个非常好的网络库,处于学习目的,我仿照其代码,实现了一个微型的muduo,就叫mini-muduo,希望有空来点评下,http://blog.csdn.net/voidccc 41楼 魔羊啊 2013-03-21 12:46发表 [回复] 果断下单买书,关掉电脑 40楼 魔羊啊 2013-03-12 16:55发表 [回复] 没接触过这些,能在mac os 下面用IDE环境编译吗,netbeans,eclipse,xcode 39楼 半湖 2012-03-23 10:43发表 [回复] muduo单线程与多线程对比测试:
muduo 0.3.4版 8线程
Speed=811533 pages/min, 2596893 bytes/sec.
Requests: 4057647 susceed, 18 failed.
muduo 0.3.4版 单线程
Speed=477556 pages/min, 1528147 bytes/sec.
Requests: 2387731 susceed, 52 failed.
muduo 0.2.9版 单线程
Speed=603669 pages/min, 281711 bytes/sec.
Requests: 3018342 susceed, 7 failed. Re: 陈硕 2012-03-27 09:12发表 [回复] 回复Busor:good 38楼 半湖 2012-03-22 19:14发表 [回复] muyu::asio,boost::asio,muduo,和Nginx 对此测试结果
http://www.cnblogs.com/busor/archive/2012/03/22/2412136.html
muyu::asio http server 1: 8个io_service, 每io_service配1个线程
Speed=996475 pages/min, 2541009 bytes/sec.
Requests: 4982372 susceed, 3 failed.
muyu::asio http server 2: 8个io_service, 每io_service配300个线程
Speed=919767 pages/min, 2345405 bytes/sec.
Requests: 4598834 susceed, 4 failed.
boost::asio 例程http server 2:one io_service per CPU,8个io_service
Speed=836536 pages/min, 1965858 bytes/sec.
Requests: 4182678 susceed, 4 failed.
boost::asio 例程http server 3:1 io_service, 2000线程
Speed=736949 pages/min, 1731823 bytes/sec.
Requests: 3684734 susceed, 11 failed.
muduo 0.3.4版 http server:8个线程
Speed=821217 pages/min, 2627890 bytes/sec.
Requests: 4106081 susceed, 7 failed.
muduo 0.2.9版 http server:8个线程
Speed=734277 pages/min, 342661 bytes/sec.
Requests: 3671372 susceed, 17 failed.
Nginx 1.0.14版
Speed=801993 pages/min, 4838681 bytes/sec.
Requests: 4009957 susceed, 9 failed.
从测试结果看,muduo网络库对短连接的支持有所改善。 Re: 陈硕 2012-03-22 19:44发表 [回复] 回复Busor:为什么没有 muduo 单线程的数据? 37楼 yunliangstar 2011-11-28 10:24发表 [回复] 你好,我想在你开源的moduo上写出一个SMTP服务器,你那个是echo服务器是一问一答的,如果要实现SMTP服务,是不是每个tcpconnection都要弄个smtp状态机。这样设计可以吗。还是在你的基础上有更好的设计方法。请教一下,谢谢 Re: 陈硕 2011-11-28 19:53发表 [回复] 回复yunliangstar:我觉得可以,这个状态机可以放到 TcpConnection 的 context 里边。 36楼 陈硕 2011-11-19 10:27发表 [回复] 回复smj1912:CMake 输出什么? Re: smj1912 2011-11-20 13:06发表 [回复] 回复Solstice:/home/python/muduo/muduo/net/protorpc/RpcServer.cc:34: warning: no matching class member found for
void RpcServer::registerService(google::protobuf::Service *service)
Possible candidates:
void muduo::net::RpcServer::registerService(::google::protobuf::Service *)
void muduo::net::RpcServer::registerService(Service *) Re: 陈硕 2011-11-20 16:11发表 [回复] 回复smj1912:这是 doxygen 的输出。
cmake 的输出是什么? Re: smj1912 2011-11-20 13:05发表 [回复] 回复Solstice:+ doxygen
/home/python/muduo/muduo/net/protorpc/RpcChannel.cc:49: warning: no matching class member found for
void RpcChannel::CallMethod(const ::google::protobuf::MethodDescriptor *method, google::protobuf::RpcController *controller, const ::google::protobuf::Message *request,::google::protobuf::Message *response,::google::protobuf::Closure *done)
Possible candidates:
void muduo::net::RpcChannel::CallMethod(const ::google::protobuf::MethodDescriptor *method,::google::protobuf::RpcController *controller, const ::google::protobuf::Message *request,::google::protobuf::Message *response,::google::protobuf::Closure *done)
void muduo::net::RpcChannel::CallMethod(const ::google::protobuf::MethodDescriptor *method, RpcController *controller, const ::google::protobuf::Message *request,::google::protobuf::Message *response,::google::protobuf::Closure *done) 35楼 yunliangstar 2011-11-01 14:37发表 [回复] 仔细看了下这个工程 的确易读 ,之前没有用过boost::bind这个东西,发现作者很喜欢这个呀。 线程创建失败也不给个提示
if ((ret = pthread_create(&pthreadId_, NULL, &startThread, this)) !=0)
{
LOG_SYSFATAL<<"pthread_create failed";
}
弄 的运行./netty_discard_server 1000这个的时候,突然不动了 ,原来是进程创建失败(系统资源限制),结果导致主线程一直等待cond_.wait(); 开始还想是不是锁出了问题,弄的我把锁的日志打印了,最后看了才知道是进程创建的问题 34楼 TalentHuang889 2011-09-14 23:19发表 [回复] 由 于我现在的虚拟机上安装的linux内核版本过低,目前还无法strace去跟踪系统调用,前端时间下载了CentOS-6.0。还没安装上去。目前只是 从源码上看.把EventLoop::loop()里面的 doPendingFunctors();移到 EventLoop::handleRead()里面,就会导致下面的函数增加3个系统调用?我看这里的系统调用无非就是 mutex_.lock();mutex_.unlock();::syscall(SYS_gettid)。但即使不迁移 doPendingFunctors();的调用地方,上面的三个函数还是少不了的。不过tid()里面有个t_cachedTid缓存了下,后面可以不 用再调。

void EventLoop::queueInLoop(const Functor& cb)
{
{
MutexLockGuard lock(mutex_);
pendingFunctors_.push_back(cb);
}

if (isInLoopThread() && callingPendingFunctors_)
{
wakeup();
}
} 33楼 soliddream66 2011-09-09 16:22发表 [回复] 请问您是怎么保证线程安全的? 32楼 maotouying 2011-09-08 14:50发表 [回复] 陈硕,你好,我看了你写的muduo 并且用C的方式重写了一遍,有个地方请教你:异步发送(TcpConnection::send )函数:
1, 如果send在其它工作者线程调用,会把"要发送的数据"动态申请一份连同方法一起放入队列传给loop线程,这样会不会有效率问题?
2, 如果在send 中直接尝试发送,不成功时追加到发送buffer,这样要一把锁。
3,以上两种方法哪一种更高效呢?有没有更好的方法? Re: 陈硕 2011-09-08 18:59发表 [回复] 回复maotouying:哪种更高效可以做 benchmark。
C++11 有 std::move,可以避免拷贝。 Re: maotouying 2011-09-08 21:04发表 [回复] 回复Solstice:我的意思是这样:
在调用 TcpConnection::send (void* data, size_t len)时,如果data是栈上指针时,runInLoop是个异步调用,send 返回后,data指针有可能已被释放,sendInLoop中不可以直接使用data指针的? Re: 陈硕 2011-09-08 21:16发表 [回复] 回复maotouying:对呀,这种情况下只能拷贝了。
TcpConnection::send() 有其他重载,比如以 Buffer&& 为参数,在C++11中可以做到无拷贝。 31楼 mfh1188 2011-07-01 09:08发表 [回复] 谢谢陈老师,谢谢您的回复,是不是decorator模式,我看错了,我再仔细研究您写的这个网络库。 30楼 mfh1188 2011-06-30 15:36发表 [回复] 陈老师,我想问问您,你写这个网络库,为什么使用decorator模式,我看你画的结构图,好像不是decorator模式,我是初学者,对您的程序,把握有点难度。 Re: 陈硕 2011-06-30 16:16发表 [回复] 回复 mfh1188: muduo 没有使用 decorator 模式。 29楼 herm_lib 2011-05-26 12:30发表 [回复] 首先肯定博主的东西不错。
个人觉得有一些问题(在别人看来可能不是问题)。

1. 有的地方运行的过程中直接用了new
2. 内部用了锁
3. 多线程的时候,callback的实现者是不是也走在多线程的环境中了? 28楼 goodtalent889 2011-04-17 13:56发表 [回复] 一般需要设计各种可选的TCP分包方式,当接到了一个完整的数据包时,才回调messageCallback_,推送数据包都应用层 Re: 陈硕 2011-04-17 17:23发表 [回复] 回 复 goodtalent889:muduo 用 codec 解决 TCP 分包的问题,见http://blog.csdn.net/Solstice/archive/2011/02/04/6172391.aspx 和《在 muduo 中实现 protobuf 编解码器与消息分发器》 27楼 goodtalent889 2011-04-17 13:53发表 [回复] muduo没有设计tcp分包的各种方式。导致读到数据就马上回调messageCallback_ 26楼 goodtalent889 2011-04-17 01:18发表 [回复] 这个Buffer类实现的效率感觉低了。copy太多。。
为啥不搞个循环buffer Re: 陈硕 2011-04-17 13:34发表 [回复] 回复 goodtalent889:http://blog.csdn.net/Solstice/archive/2011/04/17/6329080.aspx 25楼 goodtalent889 2011-04-17 01:18发表 [回复] /*Buffer 仿 Netty ChannelBuffer 的 buffer class,数据的读写透过 buffer 进行
Buffer 的生命期由 TcpConnection 控制。*/
class Buffer : public muduo::copyable 24楼 goodtalent889 2011-04-16 16:22发表 [回复] 感谢陈硕先生的及时回复,能否加我qq:49542157
方便在遇到问题时,能及时交流,thanks Re: 陈硕 2011-04-16 20:36发表 [回复] 回复 goodtalent889:我不用 QQ,有问题请给我写信。 23楼 goodtalent889 2011-04-16 16:21发表 [回复] 感谢陈硕先生的及时回复。能否加我qq:49542157
方便遇到问题时,得到及时的交流 22楼 goodtalent889 2011-04-16 09:26发表 [回复] muduo虽然是用于局域网内部的svr网络通信库,muduo源码里面,一般可以不做应用层心跳,但为啥tcp层的心跳SO_KEEPALIVE也不加上去?我个人觉得应该加上去的。而对外的svr就应该采用应用层心跳 Re: 陈硕 2011-04-16 10:43发表 [回复] 回复 goodtalent889:即使在局域网里写网络程序,应用层心跳是必须的,所以就没有加 SO_KEEPALIVE。这个可以加,如果有需求的话。 21楼 ccheng19871017 2011-04-09 14:26发表 [回复] 代码中用到了大量的boost库的bind和function,为什么不考虑tr1::bind和tr1::function呢。这样,也方便别人运行和调试你的代码。 Re: 陈硕 2011-04-09 15:41发表 [回复] 回复 ccheng19871017:因为代码里还用了 boost::any, boost::noncopyable, boost::static_assert,肯定要装 boost 才能编译。 20楼 ccheng19871017 2011-04-09 14:25发表 [回复] 写得复杂了,epoll封装和TCP服务器端并没有那么复杂。看了你的代码,我觉得你已经设计过度了。
Acceptor和Connector和TcpConnection的所有功能完全可以放在TcpServer内完成,何必把TcpServer的成员函数传过来传过去呢? Re: 陈硕 2011-04-09 15:42发表 [回复] 回复 ccheng19871017:Connector 放到 TcpServer 里干什么? TcpConnection 和 TcpServer 是多对一关系,请示范一下如何把它“放在TcpServer内完成”。 Re: ccheng19871017 2011-04-10 15:28发表 [回复] 回 复 Solstice:可以抽象出一个基类TcpBase,提供OnAccpet和OnConnect接口,Server和Client都可以直接从这个基类 派生。TcpServer在有新连接到达时,调用OnAccept接口,TcpClient在连接成功时,调用OnConnect接口,达到复用的目的。 Re: 陈硕 2011-04-10 16:13发表 [回复] 回复 ccheng19871017:复用哪个?为什么要复用?有什么好处?Server 的 onConnect 和 Client 的 onAccept 怎么处理? 19楼 goodtalent889 2011-03-27 00:49发表 [回复] 要求 Linux 的内核版本大于 2.6.28
[e06]
我的redhat是 2.6.18 18楼 goodtalent889 2011-03-27 00:42发表 [回复] 并非为安装,直接man是可以找到help内容的。应该是路径问题 17楼 goodtalent889 2011-03-27 00:42发表 [回复] 在redhat和suse下执行build.sh里面docxygen也是报错。
Problems running dot. Check your installation!
sh: dot: command not found 16楼 goodtalent889 2011-03-27 00:40发表 [回复] 陈硕先生能否尽快解决?
thanks 15楼 goodtalent889 2011-03-27 00:39发表 [回复] 1: 错误:-march= 所带参数(native)不正确
CountDownLatch.cc:1: 错误:-mtune= 所带参数(native)不正确 Re: yunliangstar 2011-11-01 14:48发表 [回复] 回复goodtalent889:gcc 版本问题 装高一点的 14楼 goodtalent889 2011-03-27 00:39发表 [回复] 如:[ 0%] Building CXX object muduo/base/CMakeFiles/muduo_base.dir/CountDownLatch.cc.o
/home/cary/3Part/muduo/muduo/base/CountDownLatch.cc: 13楼 goodtalent889 2011-03-27 00:38发表 [回复] muduo包括最新版本0.1.8在redhat和suse平台安装报错. Re: 陈硕 2011-03-27 08:47发表 [回复] 回复 goodtalent889:哪个版本的 redhat 和 suse? 哪个版本的 G++ ? 12楼 deyili 2011-03-09 11:56发表 [回复] 好东西! 11楼 takaka 2011-02-26 00:56发表 [回复] Muduo 的头文件的图是用什么画的?[e07] Re: 陈硕 2011-02-26 07:19发表 [回复] 回复 takaka:GraphViz 10楼 ThinkHY 2011-02-05 12:43发表 [回复] 博主可以放一份到GitHub上,方便粉丝们Follow和Watch。 Re: 陈硕 2011-02-05 13:04发表 [回复] 回复 ThinkHY:目前 muduo 在 github 上是一个 private repository,将来如果条件合适我会把它开放。
代码可以从 在线阅读。 9楼 luofuliang 2010-09-16 21:15发表 [回复] 虽然我是在windows而非linux下编程,而且对网络编程还是个菜鸟,但博主的muduo代码还是非常精炼和可读的,最近花了点时间把网络库和多线程库的代码都看完了,感觉开始入门了,再次感谢博主的开源! 8楼 hsc456 2010-09-10 16:47发表 [回复] 果然是个大牛, 哈哈....

订阅的博客了, 以后经常关注学习

[e10] 7楼 翡翠水滴 2010-09-02 09:45发表 [回复] 想知道和 boost::asio 相比较有什么优势? asio 未来会成为标准吧。 Re: 陈硕 2010-09-04 16:47发表 [回复] 回复 jadedrip:muduo 在 ping pong 测试下的吞吐量比 asio 高,http://blog.csdn.net/Solstice/archive/2010/09/04/5863411.aspx Re: 陈硕 2010-09-02 20:31发表 [回复] 回复 jadedrip:asio 是基于 proactor 模式的 C++ 网络库(主体部分有 4 万多行代码,十倍于 muduo),如果你喜欢 proactor 风格,或者希望跨平台,那么用它也挺好。 6楼 haierfox 2010-09-01 10:15发表 [回复] lz强人,拜读 5楼 Sam1983 2010-08-30 13:23发表 [回复] 建议以CentOS 5的kernel/库版本为基准,CentOS在服务器中占的比例大 Re: 陈硕 2010-08-30 13:52发表 [回复] 回复 Sam1983:CentOS 5 的内核是 2.6.18 版的,版本太低,有些新的系统调用没有实现,所以不能编译 muduo。 4楼 Sunpy11 2010-08-30 10:08发表 [回复] 我用的是fedora系统 3楼 Sunpy11 2010-08-30 10:07发表 [回复] muduo/muduo/net/EventLoop.cc:34: 错误:‘EFD_NONBLOCK’在此作用域中尚未声明
muduo/muduo/net/EventLoop.cc:34: 错误:‘EFD_CLOEXEC’在此作用域中尚未声明

这两个标识符找不到定义 Re: 陈硕 2010-08-30 10:46发表 [回复] 回复 Sunpy11:你用的 glibc 和 kernel 分别是哪个版本? 2楼 Sunpy11 2010-08-30 09:53发表 [回复] [e01]厉害厉害~ 1楼 hewig 2010-08-30 08:51发表 [回复] 沙发,学习
发表评论
  • 用 户 名:
  • CommShare
  • 评论内容:
  • 插入代码
阅读(3869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~