必威体育Betway必威体育官网
当前位置:首页 > IT技术

muduo源码分析(一)

时间:2019-07-27 20:10:00来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

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脚本语言等问题。

相关阅读

muduo源码学习笔记(1)

前言: ​ 对于muduo库,我觉得,光Linux多线程上提到的一些实现,还是不够的,在base/里面,还有/net里面提供了很多不错的实现,值得去学习,暑

muduo网络库的安装和使用

一、安装依赖库# 安装cmake sudo apt-get install cmake # 安装boost sudo apt-get install libboost-dev libboost-test-dev

muduo--EventLoop处理线程安全的问题

为了方便用户使用定时器接口,增加了几个函数,这几个函数都转而调用TimeQueue::addTimer(),这几个函数没有做特别的处理,是允许跨线程

分享到:

栏目导航

推荐阅读

热门阅读