关于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及其相关方法进行封装(读消息事件,发送消息事件,连接关闭事件,错误事件)

相关推荐
流云鹤18 分钟前
05Java学习day(5)
java·学习
Yao80624 分钟前
MinIO自建对象存储,省OSS费用的完整方案
前端·后端
2501_9339232532 分钟前
设计网页的时候加载不出来怎么办?认识常见的状态码
前端·spring
only-lucky39 分钟前
QML深入学习五(Controls模块)
前端·javascript·学习
程序员黑豆1 小时前
鸿蒙应用开发之路由:Router 页面路由使用教程
前端·harmonyos
Yolanda_20221 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习
gyx_这个杀手不太冷静1 小时前
Agent开发进阶指南(第 2 章):Agent 运行全流程拆解、上下文窗口、流式输出、记忆系统与 Function Call 实战
前端·架构·agent
anyup1 小时前
像这种问题千万别自己动手,否则你可太看不起 AI 了
前端·架构·trae
一只小菜鸡..1 小时前
南京大学 操作系统 (JYY) 学习笔记:CPU 的局限、GPU 与 AI 时代的算力革命
人工智能·笔记·学习
hunterandroid2 小时前
[鸿蒙从零到一] HarmonyOS Web 组件与 JSBridge 通信实战:从页面加载到安全协议
前端