关于web_server项目的学习记录(自用)

主要参考资料:
我在地铁吃闸机
基础处理框架:Multi-reactor
在这里插入图片描述
muduo库有三个核心组件实现持续监听reactor的fd:channel;epoll/poller/eventloop类

channel

事件监听器epoll_ctl监听到了fd发生了什么事件,channel类会封装每个fd和fd感兴趣的事件以及监听器返回的fd实际发生的事件。同时channel类提供了fd感兴趣事件,并将其注册到事件监听器(移除),保存了fd每种事件的处理函数

channel类重要成员变量

fd_该channel照看的文件描述符
events_该fd感兴趣事件类型集合
revents_该fd实际发生的事件类型集合,通过set_revents()来设置,并封装进channel里
event_loop该fd属于哪个loop
_callback:fd发生事件后的处理函数
void HandlerEvent(Timestamp receivetime);当调用epoll_wait()之后,该函数让每个channel根据自己照顾的fd实际发生的事件和感兴趣的事件调用处理函数

poller/EpollPoller

在本框架下,一个poller对应一个reactor。负责监听fd是否触发和fd实际发生了什么。他们两个分别都是继承实现。本项目采取epoll。
TimeStamp poll(int timeoutMs, channelList activeChannels)
当外部调用poll方法时,该方法底层是通过epoll_wait获取事件监听器上发生的fd。通过哈希表,channels_可以根据fd找到封装该fd的channel(每个fd都是由一个channel封装的)
,事件发生后,写入channel类中的revents,然后把channel封装进activeChannels(监听结果vector<channel
>)

EventLoop

上文提到调用完poller会得到监听结果,而网络服务器需要持续监听持续获取持续处理的能力。所以eventloop负责实现循环。eventloop会整合上面两类组件。
图片也是引用的

OneloopPerThread

每个eventloop都绑定一个线程(Muduo的特点)利用多核CPU每个核的线程负责循环监听一组文件描述符fd的集合。
调用poller获得监听结果,调用每一个channel为其分配好的处理函数。

acceptor

接受新用户连接并且分发给subreactor

重要成员变量

acceptSocket_是服务器监听套接字的文件描述符
acceptChannel_是channel类,把上边的变量核感兴趣事件核事件对应的处理函数都封装进去。
EventLoop *loop监听套接字的fd由哪个subloop负责循环
newConnectionCallback_公平地选择一个subloop

重要成员方法

listen()开启对acceptSocket_的监听同时将acceptChannel_以及感兴趣的事件注册到mainloop的事件监听器上。
hanleRead()当mainloop监听到acceptChannel上发生了可读事件(新用户连接),就调用该函数。里面还调用了newConnectionCallback_保存的函数。

buffer

封装了用户缓存区,像这个缓冲区读写数据。
vector方便动态扩容。
可支持读一点,写一点。
别人的图片

重要成员函数

append()将数据添加到缓冲区
retrieveAsString(len)获取缓冲区中长度为len的数据
retrieveAllString获取所有
ensureWriteableBytes(len)在写入len长度的数据之前先确定能不能装下
ssize_t Buffer::readFd客户端发来数据,readFd从该TCP接收缓冲区将数据读出来并放入buffer
ssize_t Buffer::writeFd

TcpConnection类

acceptor是在mainloop中对服务器监听套接字fd及其相关方法进行封装(监听,接受链接,分发)
TcpConnection是在subloop中对连接套接字fd及其相关方法进行封装(读消息事件,发送消息事件,连接关闭事件,错误事件)

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

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

相关文章

C# OpenCv Haar、LBP 人脸检测

目录 效果 代码 下载 效果 代码 using OpenCvSharp;namespace OPenCVDemo {class Program{static void Main(string[] args){// Load the cascadesvar haarCascade new CascadeClassifier("haarcascade_frontalface_default.xml");var lbpCascade new Casca…

网络原理-传输层-UDP报文结构

本文介绍UDP报文 有很多友友搞不清楚UDP报文的详细结构还有TCP的详细结构,所以专门分开来讲 以免弄混. 首先我们先看一下整个UDP结构,让大家有一个全方面的认识 下面我们来详细解释UDP报 16位源端口号(本机):就是2字节大小,16个二进制位. 16位目的端口号(目的机):也是2字节…

Ubuntu18.04安装wireshark

安装wireshark 环境Ubuntu18.04 1.使用root用户进行安装 2.将 wireshark-dev/stable PPA 添加到系统的软件源列表中。系统就可以从该PPA获取Wireshark软件包及其更新了。 apt-add-repository ppa:wireshark-dev/stable3.确保你系统上的软件包信息是最新的&#xff0c;这样在…

百度智能小程序源码系统简洁版 SEO关键词排名推广优化 带完整的安装代码包以及搭建教程

移动互联网的快速发展&#xff0c;小程序以其轻量级、无需下载、即用即走的特点&#xff0c;迅速成为了各大平台争相推广的重要产品形态。百度智能小程序作为百度生态下的重要一环&#xff0c;凭借其强大的流量入口和丰富的功能组件&#xff0c;为开发者提供了广阔的创作空间。…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆&#xff0c;产业创新新引擎》。 各位领导、来宾、媒体朋友们&#xff0c;大家上午好。很高兴今天在石景山首钢园&#xff0c;和大家一起沟通和探讨大模型的发展趋势&#xff0c;以及百度最近一段时间的思考和…

灵动翻译音频文件字幕提取及翻译;剪映视频添加字幕

参考&#xff1a;视频音频下载工具 https://tuberipper.com/21/save/mp3 1、灵动翻译音频文件字幕提取及翻译 灵动翻译可以直接chorme浏览器插件安装&#xff1a; 点击使用&#xff0c;可以上传音频文件 上传后自动翻译&#xff0c;然后点击译文即可翻译成中文&#xff0c;…

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

Svg Flow Editor 原生svg流程图编辑器(四)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

新版Idea2023.3.5与lombok冲突、@Data失效

新版idea和lombok冲突&#xff0c;加上Data&#xff0c;其他地方get set也不报错&#xff0c;但是一运行就找不到get set方法。 但是直接使用Getter和Setter可以访问、应该是Data失效了。 解决方法&#xff1a; 看推上介绍是 lombok 与 idea 采集 get 、set 方法的时候所用的技…

centos node puppeteer chrome报错问题

原因&#xff1a;缺少谷歌依赖包&#xff0c;安装以下即可 yum install atkyum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf…

镜视界 | DevSecOps CI/CD 管道中数字供应链安全的集成策略

目录 前言 数字供应链&#xff08;DSC&#xff09;的定义 数字供应链安全的重点内容和风险因素 CI/CD管道的安全目标和可信实体 将数字供应链安全集成到CI/CD管道中 结语 本文字数&#xff1a;7715&#xff0c;阅读时长&#xff1a;19分钟 1.前言 在敏捷开发的模式下&…

STM32/GD32的以太网DMA描述符

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构&#xff0c;链式结构和环形结构。 常用的是链式结构。 标准库中&#xff0c;关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…