当前位置: 首页> 财经> 产业 > 广州地铁封闭最新消息_手机优化师下载_百度账号找回_2345浏览器网址导航

广州地铁封闭最新消息_手机优化师下载_百度账号找回_2345浏览器网址导航

时间:2025/7/10 9:57:23来源:https://blog.csdn.net/2303_77982246/article/details/145600822 浏览次数:0次
广州地铁封闭最新消息_手机优化师下载_百度账号找回_2345浏览器网址导航

1. 前言

在这里插入图片描述

这是EpollServer中处理读取数据的逻辑,该代码存在一些问题

  1. 我们从fd读上来的数据都放在同一个buffer中了,如果有多个fd,数据不就混在一起了吗?
  2. 通过非阻塞循环读取,确实能将本轮数据全部读上来,但如何保证读上来的数据是一个完整的报文?

因此,我们对每个fd都要建立一个单独的缓冲区,同时要引入协议

2. Reactor

Reactor是什么,我们暂时不管,先编写代码

不管是listensockfd,还是普通sockfd,今天我们不做区分,统称为"连接"

"连接"分为两种,监听sockfd和普通sockfd,用宏进行定义,同时提供属性的接口

每当"连接"底层事件就绪时,希望自动调用对应的处理方法,将数据放到自身的缓冲区中;因此,在每个连接中添加一批方法和缓冲区

在这里插入图片描述

Rector中以unordered_map的数据结构将Connection管理起来,键值为sockfd

要提供能添加连接的接口,添加连接中,要完成三个任务:

  1. 创建Connection对象,并设置好属性
  2. Connection对象添加到数据结构中
  3. 托管给epoll

对于epoll的操作,我们也进行封装,使用模板方法类的设计模式,对外提供接口

在这里插入图片描述

在这里插入图片描述

接下来,我们需要一个专门用来监听的"连接",将它单独设计为一个模块,为Listener

在这里插入图片描述

Main函数中,将listensockfd添加到Reactor中,开始进行事件的派发

在这里插入图片描述

进行事件派发时,将EPOLLERR/EPOLLHUP等事件统一交给EPOLLIN,EPOLLOUT进行处理

EPOLLIN事件到来,在每个Connection中不是有对事件的处理方法吗?直接回调

EPOLLOUT也是同理

在这里插入图片描述

但每个"连接"的处理方法还没有,因此,AddConnection中,还要进行处理方法的注册

将两种套接字的处理方法都放在Reactor中,AddConnection时,根据"连接"的类型,注册不同的方法

在这里插入图片描述

在Main函数中,就要提前注册好ListenerNormal的处理方法

在这里插入图片描述

在这里插入图片描述

我们的Listener就开始监听,当有连接到来,自动回调到Accepter

所有ET模式下的fd都要设置为非阻塞,listensockfdsockfd都要设置为非阻塞

连接到来,进行非阻塞循环读取

成功获取一个连接,由于需要调用Reactor中的AddConnection方法,因此,每个Connection都需要知道自身所处的Reactor,添加一个Reactor的地址即可

在这里插入图片描述

在这里插入图片描述

将新的连接添加到Reactor中,当连接底层读事件就绪,就会自动回调到处理读事件的方法

对于读,由于sockfd设置为ET模式,也是非阻塞循环读取,将读到的数据全部放到连接自身的缓冲区中

在这里插入图片描述

如何保证读到的是一个完整的报文?连接只负责IO,如何处理读到的数据则交给报文解析模块,因此,Normal内部需要有解析报文的方法

当底层数据读完了,执行报文解析方法

报文解析在cal_server代码中就有,直接拿来用

对于写,关心的是底层发送缓冲区有无空间,一个新获得的sockfd默认发送缓冲区为空

因此,写事件默认就是就绪的,直接发送数据即可

当写条件不满足时,也就是发送缓冲区满了并且数据没有发完,我们再开启对写事件的关心

如何得知写条件不满足呢?调用send接口失败,根据errno判断

等到写事件就绪,Reactor中会自动调用到发送数据的接口,替我们将剩余的数据发送了

需要注意的是:

  1. 如果默认就开启对写事件的关心,底层就会有大量写事件就绪,因此,对于写事件我们按需开启关心
  2. 当数据发完了,需要关闭对写事件的关系
  3. 如果设置了对写事件的关心,epoll对首次设置关心写事件时会默认就绪一次

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最后就是异常事件的处理了,当读/写出错,自动调用处理异常方法

在这里插入图片描述

3. 总结

在这里插入图片描述

Reactor类似于一种Connection的容器,当底层事件就绪,进行事件派发,让不同的Connection的去处理事件

Reacotr是基于事件驱动的网络服务器设计的主流模式

关键字:广州地铁封闭最新消息_手机优化师下载_百度账号找回_2345浏览器网址导航

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: