muduo源码分析(一)

muduo是个基于现代C++高效的高并发网络库,他依赖boost库,由陈硕大神编写,更多详情介绍,请看点击打开链接

muduo代码结构比较清晰易懂,各个细节处理的非常完美,是一个非常值得学习的开源库。基于他是个网络库,开篇我剖析他的网络相关部分的结果,各个类的继承,调用关系。

网络服务器要处理的对象无外乎,监听者TcpServer,连接接收者Acceptor,连接者TcpConnection等等主体对象。要处理的事件有监听者可写,连接者读写等主体事件。宏观上面,所有的连接可以看作成一个通道Channel,通道有网络IO事件。

有了上面的对象主体,我们再来理清对象之间的关系和各自的职责。

首先网络模块得有个主体,启动服务器的动作将从这里开始。我们命名为TcpServer。网络服务器有个很重要的事情就是等待连接。我们剥离他,命名为连接接收者Acceptor。创建监听socket可以放在TcpServer中,也可以放在Acceptor中。Acceptor的职责是响应连接者事件,功能比较单一,而且网络中一般只有一个Acceptor,所以muduo放在了Acceptor中。

当Acceptor收到有连接的事件时,如何响应,谁来响应呢?

再让Acceptor处理连接事件有点不妥,让TcpServer处理这种关系的产物比较合适,因为TcpServer本身职责就是处理各个类之间的关系。Acceptor如何来通知TcpServer响应呢?

一般是采用回调的方式。回调也有两种处理办法。

一种是采用接口回调的方式。让TcpServer具备响应处理接收连接的方法。然后让Acceptor拥有TcpServer的对象指针。可是让Acceptor直接拥有TcpServer对象的指针又有点不合理,毕竟在逻辑包含关系上有点牵强。当然这个只是理由之一,我们可以利用接口继承的方式,让接口有处理响应接收连接的方法,然后TcpServer实现了这个接口,同时Acceptor拥有这个接口指针。这样一来就很好的处理了这个问题,也降低了整个框架的耦合度。事实上,实际的项目中很多问题都可以使用这种接口回调的方式。

然而muduo并没有采用这种接口回调的方式,而是采用绑定回调的方式,因为陈硕提倡一种基于对象而不是面向对象的方式。具体优缺点牵扯就有点大了,涉及软件工程等方面的知识,这个有兴趣再谈。

绑定回调就是让Acceptor绑定TcpServer的处理方法。C++可以使用stl的bind方法,具体细节和原理我们后面有机会再谈。

总之,就是当Acceptor连接事件触发时,让TcpServer得到响应,添加新的连接。

Acceptor又是如何触发连接事件的呢?前面我们说到,所有连接我们可以看成是一个通道,Acceptor也是个通道,他也会有通道对象Channel。通道对象Channel会处理各种网络IO事件,我们把这个通道的写事件绑定到Acceptor上,Acceptor就可以处理连接事件了。原理还是和上面的一样。

关于通道对象Channel响应事件的方式,后面会有专门的blog来讲。

以上对象的关系可以用下图表示:

开篇只是探讨了网络编程中各种对象关系的处理方式,这些方式将贯穿这个项目中,理解了这些方式,理解整个项目将变得简单。

 

 

我自己用C语言实现了muduo,代码结构比muduo简单,吞吐量要比muduo稍高。代码在git上,赏个星星

https://github.com/shonm520/mu_event

 

欢迎加入QQ群 858791125 讨论skynet,游戏后台开发,lua脚本语言等问题。

 

 

 

 

 

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值