前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >muduo源码分析(一)-整体框架说明

muduo源码分析(一)-整体框架说明

原创
作者头像
路小饭
修改2019-03-11 10:30:26
4K0
修改2019-03-11 10:30:26
举报

muduo是chenshuo开源的一个基于reactor pattern的多线程网络库。同时他也写了一本关于此网络库的书《Linux多线程服务端编程:使用muduo C++网络库》,推荐阅读。

muduo部分的文章偏向笔者自己的整理,想了解更细节的东西可以找上面那本书出来看看

1 整体框架说明

muduo整体是按照回调函数方式编写的,这样虽然在调用的时候更方便,但对于初学者梳理逻辑来说就有点“绕”了。看“别人家”的网络库,抓住以下几点有利于快速理解代码:

  • 网络库是怎样bind、listen和accept的
  • epoll模型被封装成啥样了,是怎样调度读写事件的
  • accept描述符是怎样被注册到epoll模型中的

  • muduo中有一个EventLoop总体负责绑定和监听端口,EventLoop调用Acceptor中函数完成bind、listen、accept操作
  • epoll模型的操作也被封装在了EventLoop中,EventLoop中loop方法中完成对epoll模型的调度
  • epoll对读写事件的操作封装在了Channel类中
  • accept描述符注册到epoll中是通过Channel中的enableReading进行的

上图中也能看出网络库的整体处理逻辑:

  • 有个EventLoop(图中的左上角)负责接收外界的请求,把成功建立的连接(TcpConnection)分配到EventLoopThreadPool中具体的EventLoop中(图中的EventLoop1、EventLoop2、EventLoop3等)

2 分阶段解析

先上图:(看不清楚可右键--在新标签页中打开图片)

1号虚线框

1号虚线框干了两件事儿,一是完成的描述符的创建和bind操作;二是注册了回调函数。

注意:

紫色的ConnectionCallback在3号虚线框中用到;红色的MessageCallback在4号虚线框中用到;蓝色的TcpServer::newConnection在3号虚线框中用到;橙色的Acceptor::handleRead在3号虚线框中用到(请原谅我的颜色描述能力。。。)

ConnectionCallback和MessageCallback是暴露给外界使用的。ConnectionCallback在请求成功(::accept)后调用;MessageCallback在处理具体请求时调用

  • net库对外封装为TcpServer类,提供了两个可供外界实现的回调函数接口:ConnectionCallback和MessageCallback
  • 在TcpServer的构造函数中初始化了Acceptor和EventLoopThreadPool
  • Acceptor中创建了socket同时进行了bind;将socket放在了acceptChannel中,在acceptChannel中注册了Acceptor::handleRead函数;绑定了TcpServer::newConnection函数

2号虚线框

2号虚线框也干了两件事儿,一是完成socket的listen操作,二是将socket注册到epoll模型中

  • TcpServer通过start函数调用了EventLoop的runLoop方法
  • runLoop中执行了Acceptor::listen函数,在此函数中完成了socket的listen操作和注册到epoll模型的操作

3号虚线框

2号虚线框已经把listen的socket注册到epoll中,当有客户端连接请求时会触发epoll模型。3号虚线框描述的就是此时的操作。3号虚线框把accept成功的socket放到了TcpConnection中,并按照轮询方式把TcpConnection的socket注册到不同的EventLoop中

  • 当有客户端发起链接时,触发acceptChannel_中注册的Acceptor::handleRead函数,而Acceptor::handleRead中继续调用了Acceptor中注册的TcpServer::newConnection
  • 在TcpServer::newConnection中,进行了socket的accept操作,并生成了新的TcpConnection
  • 后续再runInLoop中调用了TcpConnection::connectEstablished方法,将socket注册到EventLoopThreadPool中的EventLoop中,并调用了在TcpServer中注册的ConnectionCallback函数

4号虚线框

4号虚线框epoll模型开始等待外界发送请求,这时会触发channel_的handRead方法,在handRead中读取了请求,然后调用了TcpServer中注册的messageCallback_方法。

messageCallback_方法中不仅包含处理请求的逻辑,还必须考虑怎样返回结果,其中一种可选方式是调用TcpConnection的send方法发送结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 整体框架说明
  • 2 分阶段解析
    • 1号虚线框
      • 2号虚线框
        • 3号虚线框
          • 4号虚线框
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档