[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

一、前言

在学习 C++ 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深度剖析其内在,并跟着老师用c++11重构了Muduo库中核心的Multi-Reactor架构(Muduo库还有很多需要学习的内容,比如rpc、HTTP等通信协议,poll的使用等还没有进行学习,之后有机会会一一补上),所以在此写一个[muduo网络库]系列的一些梳理笔记,剖析一下大佬精妙的代码设计思想,希望能够理清自己的思路,也希望能够帮助到大家。

最后,本人为初学者,还在不断的摸索过程中,这个系列的内容可能存在大量不足,希望路过的各位大佬们,看到问题能够提出来,我一定虚心接受并且及时作出更正。希望大家能够持续关注这个系列,这也督促我能够一直写下去。

这一节先来介绍muduo网络库的模型。

二、muduo 模型

Muduo库是基于Reactor模式实现的TCP网络编程库。其中的重要组件是由**Event(事件)、Reactor(反应堆)、Demultiplex(事件分发器)和Evanthandler(事件处理器)**四部分构成的,其相互关系如下图所示:

  • 首先,将事件Event注册到反应堆Reactor上,即将应用程序感兴趣的事件注册到反应堆上,请求反应堆帮助监听,若事件发生,反应堆调用应用程序预制的回调(handler),一个event对应一个handler;
  • 反应堆Reactor相当于是一个事件以及事件处理的集合,通过相应的方法在事件分发器Demultiplex里做一个相应的调整(add/mod/del event),然后启动事件循环(epoll_wait),服务器处于阻塞状态等待新用户的连接,或者已连接用户的读写事件
  • 如果epoll_wait监听到有新事件产生,分发器返回事件给反应堆,反应堆调用相应的事件处理器eventhandler;
  • eventhandler中读取用户的请求,解码,处理,打包,发送。

在muduo库的Reactor模型上:

  • Poller和EPollPoller就是Demultiplex
  • Channel封装了Event,里面存在fd,events,revents,以及相应的回调函数callbacks,其中有两种channel,acceptorChannel以及connectionChannel分别对应listenfd以及connfd
  • EventLoop就是Reactor

这也就看出muduo库的三个核心组件是:Channel类、Poller/EpollPoller类以及EventLoop类这三个组件之间的关系如下图所示:

代码地址:https://github.com/Cheeron955/mymuduo/tree/master

本小节就到这里,下一篇我会对着三个核心组件进行一个详细的剖析介绍,希望有需要的小伙伴可以持续关注哦~

相关推荐
爱码小白7 分钟前
网络编程(王铭东老师)笔记
服务器·网络·笔记
CYBEREXP200810 分钟前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
蜜獾云17 分钟前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
ZSYP-S28 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
柒烨带你飞29 分钟前
路由器转发数据报的封装过程
网络·智能路由器
yuanbenshidiaos31 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos35 分钟前
C++----------函数的调用机制
java·c++·算法
程序员_三木43 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++