muduo网络库剖析——通道Channel类

muduo网络库剖析——通道Channel类

  • 前情
    • 从muduo到my_muduo
  • 概要
    • 事件种类
    • channel
  • 框架与细节
    • 成员
    • 函数
    • 细节实现
    • 使用方法
  • 源码
  • 结尾

前情

从muduo到my_muduo

作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者,我们需要抽取其中的精华进行简要实现,这要求我们足够了解muduo库。

做项目 = 模仿 + 修改,不要担心自己学了也不会写怎么办,重要的是积累,学到了这些方法,如果下次在遇到通用需求的时候你能够回想起之前的解决方法就够了。送上一段话!

在这里插入图片描述

概要

事件种类

epoll_event是Linux操作系统中的一个数据结构,用于表示一个I/O事件。它在使用epoll多路复用技术时作为参数传递给相关的函数,以便在事件发生时通知应用程序。
epoll_event结构体的定义如下:

struct epoll_event {  __uint32_t events;  /* Epoll events */  epoll_data_t data;  /* User data variable */  
};

其中,events表示事件,例如EPOLLIN(需要读取数据的情况)、EPOLLOUT(输出缓冲为空,可以立即发送数据的情况)等。data是用户数据变量,可以使用union epoll_data来定义,其中ptr可以指向任何类型的用户数据,fd表示文件描述符,u32和u64分别表示一个32位和64位的无符号整数。

当应用程序注册了某个文件描述符到一个epoll实例上时,就可以通过epoll_event结构体来指定对应的事件以及关联的用户数据。当这些事件发生时,epoll系统调用会返回对应的epoll_event结构体,以便应用程序处理事件。

总的来说,epoll_event结构体是Linux系统中实现事件驱动编程的一个关键数据结构,通过它可以将多个I/O事件集中处理,提高了程序的效率和响应性。

channel

而channel和event一一映射,通过channel能够获取到event中的events,即感兴趣的事件,通过channel也可以改变events感兴趣的事件。同时Poller监听,如果有事件发生,那么该事件所对应channel也会调用所相应发生事件的回调函数。这就是channel类的主要作用,起到了一个代表event,但大于event作用的这样一个类。

框架与细节

成员

在这里插入图片描述
channel中成员包括自己所属的事件循环,还有channel对应的套接字,用来监听;以及该channel中event所感兴趣的事件,和真正监听到的事件,以及channel此时在Poller中处于什么状态,对应着Poller是否在监听对应的event.
在这里插入图片描述
代表感兴趣事件的类型。设为static变量,类使用。
在这里插入图片描述
以及相关的函数回调。

函数

包括一系列的函数调用声明,以及读写事件的确认与设置,感兴趣事件对应event修改,事件发生时对应回调函数触发。完成channel的与event对应,以及channel能够作为触发对象针对event监听到的事件进行函数回调触发等功能。

细节实现

如果h文件中不会规定某类的大小,或者只用到了某类的指针,我们可以通过声明class而不是include头文件的来减少头文件信息的暴露。比如:
当中的EventLoop类在h文件中只涉及指针,更多细节在cc文件中实现。那我们在头文件中只写class EventLoop;而在cc文件中再包含上EventLoop.h即可。
在这里插入图片描述
在这里插入图片描述
update函数和remove函数表示着通道的更新和删除,我们统一的实现是在时间循环类EventLoop趋势线这两个函数,所以channel和Poller中的对通道的更改会调用EventLoop类中的对channel更改函数。

使用方法

源码

//Channel.h
#pragma once#include <functional>
#include <sys/epoll.h>#include "noncopyable.h"
#include "Timestamp.h"
#include "Log.h"class EventLoop;  class Channel : noncopyable {
public:using EventCallback = std::function<void()>;using ReadEventCallback = std::function<void(Timestamp)>;Channel(EventLoop* loop, int fd) : loop_(loop), fd_(fd), events_(0), status_(0) {}~Channel() = default;int fd() const { return fd_; }EventLoop* loop() const { return loop_; }int status() const { return status_; }int events() const { return events_; }bool isReading() const { return events_ & kReadEvent; }bool isWriting() const { return events_ & kWriteEvent; }bool isNoneEvent() const { return events_ == kNoneEvent; }void enableReading() { events_ |= kReadEvent; update(); }void enableWriting() { events_ |= kWriteEvent; update(); }void disableReading() { events_ &= ~kReadEvent; update(); }void disableWriting() { events_ &= ~kWriteEvent; update(); }void disableAll() { events_ = kNoneEvent; update(); }void setReadCallback(const ReadEventCallback& cb) { readCallback_ = cb; }void setWriteCallback(const EventCallback& cb) { writeCallback_ = cb; }void setErrorCallback(const EventCallback& cb) { errorCallback_ = cb; }void setCloseCallback(const EventCallback& cb) { closeCallback_ = cb; }void remove();void set_revents(int revents) { revents_ = revents; }void set_status(int status) { status_ = status; }void handleEventWithGuard(Timestamp receiveTime);
private:void update();EventLoop* loop_;int fd_;int events_;int revents_;int status_;static const int kNoneEvent;static const int kReadEvent;static const int kWriteEvent;EventCallback writeCallback_;EventCallback errorCallback_;EventCallback closeCallback_;ReadEventCallback readCallback_;
};//Channel.cc
#include "Channel.h"
#include "EventLoop.h"void Channel::update() {loop_->updateChannel(this);
}void Channel::remove() {loop_->removeChannel(this);
}void Channel::handleEventWithGuard(Timestamp receiveTime) {LOG_INFO("%s--%s--%d : channel handle revents : %d\n", __FILE__, __FUNCTION__, __LINE__, revents_);if ((revents_ & EPOLLHUP) && !(revents_ & EPOLLIN)) {if (closeCallback_) closeCallback_();}else if (revents_ & EPOLLERR) {if (errorCallback_) errorCallback_();}else if (revents_ & EPOLLIN) {if (readCallback_) readCallback_(receiveTime);}else if (revents_ & EPOLLOUT) {if (writeCallback_) writeCallback_();}
}

结尾

以上就是通道Channel类的相关介绍,以及我在进行项目重写的时候遇到的一些问题,和我自己的一些心得体会。发现写博客真的会记录好多你的成长,而且对于一个好的项目,写博客也是证明你确实有过深度思考,并且在之后面试或者工作时遇到同样的问题能够进行复盘的一种有效的手段。所以,希望uu们也可以像我一样,养成写博客的习惯,逐渐脱离菜鸡队列,向大佬前进!!!加油!!!

也希望我能够完成muduo网络库项目的深度学习与重写,并在功能上能够拓展。也希望在完成这个博客系列之后,能够引导想要学习muduo网络库源码的人,更好地探索这篇美丽繁华的土壤。致敬chenshuo大神!!!

鉴于博主只是一名平平无奇的大三学生,没什么项目经验,所以可能很多东西有所疏漏,如果有大神发现了,还劳烦您在评论区留言,我会努力尝试解决问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240179.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器(1)

文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待&#xff0c;只要有一个就绪&#xff0c;就使用select/poll系统调用&#xff0c;让操作系统把所有文件遍历一遍&#xff0c;哪些就绪就加上哪…

07-微服务getaway网关详解

一、初识网关 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例…

Databend 开源周报第 128 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用 Databend …

BuildRoot配置RTL8822CE WIFIBT模块(WIFI部分)

TinkerBoard2主板自带的无线模块为RTL8822CE&#xff0c;PCIe接口 之前在风火轮下载的Linux源码编译出来的BuildRoot根文件系统没有相关的驱动文件 [rootrk3399:/]# find . -name *.ko [rootrk3399:/]# lsmod Module Size Used by Not tainted [rootrk33…

UI设计中插画赏析和产品色彩分析

插画赏析&#xff1a; 1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量…

ARM day1

一、概念 ARM可以工作的七种模式用户、系统、快中断、中断、管理、终止、未定义ARM核的寄存器个数 37个32位长的寄存器&#xff0c;当前处理器的模式决定着哪组寄存器可操作&#xff0c;且任何模式都可以存取&#xff1a; PC(program counter程序计数器) CPSR(current program…

自存angular cli创建分区的module

创建module ng g module /admin/promotion --routing 目标文件夹下会有 正常创建组件 在上一级路由中写 promotion的路由 {path: "promotion", //推广loadChildren: () >import("./promotion/promotion.module").then((m) > m.PromotionModul…

详解React与Vue的性能对比

React 和 Vue 是当前最流行的前端开发框架之一。它们都具有高度的灵活性和可扩展性&#xff0c;但在某些方面有所不同。在本篇文章中&#xff0c;我将详细介绍 React 和 Vue 这两个技术&#xff0c;并比较它们的优点和缺点。 目录 1. React&#xff1a; 1.1 优点&#xff1a; …

力扣白嫖日记(sql)

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 586.订单最多的客户 表&#xff1a;Orders 列名类型order_numberintcustomer_numberint 查找下了最多订单的…

QT第五天

使用QT绘图和绘图事件&#xff0c;完成仪表盘绘图&#xff0c;如下图&#xff1a; 程序运行结果&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPen> #include <QBrush&…

PDF 文档解除密码

PDF 文档解除密码 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要2. PDF365References 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要 密码保护《算法设计与分析基础_第3版.pdf》 2. PDF365 https://www.pdf365.cn/ 免费功能 -> PDF 去密码 开始去除 Re…

MySQL入门篇:事物操作(开启事物,提交事物,回滚事物),事物四大特性(ACID),并发事物问题(脏读,不可重复读,幻读),事物隔离级别

目录 1.事物简介2.事物操作1.查看/设置事物提交方式&#xff08;方式1&#xff09;2.开启事物&#xff08;方式2&#xff09;3.提交事物4.回滚事物 3.事物四大特性(ACID)1.原子性&#xff08;Atomicity)2.一致性&#xff08;Consistency)3.隔离性&#xff08;lsolation)4.持久性…

数据结构奇妙旅程之二叉树初阶

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

一、MySQL 卸载

目录 1、软件的卸载准备 2、软件的卸载 方式一&#xff1a;通过控制面板卸载 方式二&#xff1a;通过mysql8的安装向导卸载 1、双击mysql8的安装向导 2、取消更新 3、选择要卸载的mysql服务器软件的具体版本 4、确认删除数据目录 5、执行删除 6、完成删除 3、清理残…

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路&#xff08;状态机实现&#xff09;分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路&#xff08;状态机实现&#xff09; module Detect_101(input clk,input rst_n,input data,o…

机器人持续学习基准LIBERO系列4——robosuite最基本demo

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新 1.robosuite的相关资料 是基于MuJoCo的机器人学习方针环境&#xff0c;提供一套基准环境…

《WebKit 技术内幕》之三(3): WebKit 架构和模块

3 Webkit2 3.1 Webkit2 架构及模块 相比于狭义的WebKit&#xff0c;WebKit2是一套全新的结构和接口&#xff0c;而并不是一个简单的升级版。Webkit2 的思想同 Chrominum 类似&#xff0c;就是将渲染过程放在单独的进程中来完成&#xff0c;独立于用户界面。 webKit2中…

机器人领域顶刊TRO,TASE及RAL的区别与关系

一、背景 机器人领域越来越火&#xff0c;特别是在具身智能的加持下&#xff0c;让机器人在不久的未来可以完成更多复杂的任务&#xff0c;进入到我们的日常生活&#xff08;不过应该还需要很长很长时间&#xff09;。作为机器人方向的Researcher&#xff0c;我们会看许多机器…

未来科技五年人工智能行业产业发展趋势最新竞争力

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是近年来快速发展的热门领域&#xff0c;被广泛应用于各个行业。随着技术的不断创新和突破&#xff0c;人工智能行业的竞争力也在不断提升。本文将分析未来科技五年人工智能行业产业发展趋势&#xff0c…