当前位置: 首页 > news >正文

视频一页网站怎么做北京高端网站建设有限公司

视频一页网站怎么做,北京高端网站建设有限公司,网站建设概算,wordpress非官方目录 设计思路 类的设计 模块实现 私有接口 公有接口 疑惑点 设计思路 Acceptor模块是专门用于接收获取新连接,该模块挂载在主Reactor线程上。 也就是创建一个监听套接字。为监听套接字设置读回调函数。当监听套接字读事件到来时,需要自动调用读事…

目录

设计思路

类的设计

模块实现 

私有接口

公有接口

疑惑点


设计思路

Acceptor模块是专门用于接收获取新连接,该模块挂载在主Reactor线程上。 也就是创建一个监听套接字。为监听套接字设置读回调函数。当监听套接字读事件到来时,需要自动调用读事件回调,为新连接创建Connection对象并添加管理,同时Acceptor还需要和一个EventLoop绑定。

 那么Acceptor中需要一个Socket对象初始化一个监听套接字一个EventLoop指针进行循环监听新连接的到来一个Channel对象用于当新连接到来时调用读事件回调还需要一个TcpServer的创建新连接的回调函数。 因为Acceptor本身是没有办法向TcpServer中添加Conenction对象进行管理的,我们需要提供TcpServre的接口来进行,TcpServer模块会对服务器的所有模块进行统一管理。

类的设计

  • Socket _listen_socket
    • 这是一个监听套接字的封装,用于在特定端口上监听客户端的连接请求
    • 它负责创建套接字、绑定地址和端口、监听连接
  • Channel _channel
    • Channel是事件通道,它将特定文件描述符(这里是监听套接字)的事件注册到EventLoop中
    • 它允许Acceptor监控监听套接字上的读事件(即新连接到来)
  • EventLoop* _loop
    • 指向事件循环的指针,事件循环是网络库的核心,负责监控所有I/O事件
    • Acceptor通过这个指针将监听事件注册到事件循环中
  • AcceptCallback _accept_callback
    • 这是一个函数对象类型,定义为接收一个int参数(连接文件描述符)的回调函数
    • 当新连接到来时,Acceptor会调用这个回调函数,将新连接的处理权交给调用者
class Acceptor 
{
private:Socket _listen_socket;        // 创建监听套接字Channel _channel;             // 对监听套接字的读事件进行监控EventLoop* _loop;             // 事件循环// 本质用于设置通信套接字的回调,由服务器模块提供using AcceptCallback = std::function<void(int)>;AcceptCallback _accept_callback;
};

模块实现 

过程就是,你给我一个端口号,然后我创建个监听套接字去监听这个端口,当监听到有客户端连接了,就说明触发了读事件回调函数,把这个客户端交给另一个函数去处理,另一个函数负责调用Accept返回一个连接套接字,当Acceptor成功接受一个新的客户端连接后,它会将这个新连接的处理权交给其他部分的代码。

为了更好的理解,我写了一个工作流程:

  1. 初始化阶段
    • 创建Acceptor对象,传入事件循环和监听端口
    • 创建监听套接字,并与Channel关联
    • 设置Channel的读事件回调为HandlerRead方法
  2. 设置阶段
    • 外部代码(通常是TcpServer)调用SetAcceptCallback设置新连接的处理函数
  3. 激活阶段
    • 外部代码调用Listen方法开始监听
    • Channel被注册到事件循环中,开始监控读事件
  4. 工作阶段
    • 当有新客户端连接到来时,事件循环检测到读事件
    • 事件循环调用Channel的读事件回调(即HandlerRead方法)
    • HandlerRead接受连接,获取新连接的文件描述符
    • HandlerRead调用预先设置的_accept_callback,将新连接的处理权交给上层代码

私有接口

private:int CreateListenSocket(int port)//创建监听套接字{bool ret = _listen_socket.CreateServer(port);assert(ret == true);return _listen_socket.SockFd();}void HandlerRead()//监听通信套接字的读回调{//1. 接收新连接int connfd = _listen_socket.Accept();if (connfd < 0){return;}//2. 调用新连接回调函数  //是指当Acceptor成功接受一个新的客户端连接后,它会将这个新连接的处理权交给其他部分的代码。if (_accept_callback){_accept_callback(connfd);}}

公有接口

public:Acceptor(EventLoop* loop, int port)//构造函数:_loop(loop), _listen_socket(CreateListenSocket), _channel(loop, _listen_socket.SockFd());{//绑定读事件回调_channel.SetReadCallBack(std::bind(&Acceptor::HandlerRead, this));}void Listen()//开始监听{_channel.EnableRead();}//允许Acceptor类的使用者设置一个回调函数,该回调函数将在新连接被接受后被调用。void SetAcceptCallback(const AcceptCallback& cb)//提供给外部和内部共同设置监听套接字读回调{_accept_callback = cb;}

疑惑点

这里为啥需要EventLoop类 我知道socket类是为了创建监听套接字 Channel类是为了给监听套接字设置读事件回调函数 那EventLoop类是干嘛的?

为啥类成员变量,EventLoop是指针,而其他的是成员呢?

那为啥channel不也是指针呢?Acceptor不就是需要一个channel类中的读事件回调函数

需要Channel类中的设置读回调函数。以及启动读事件回调函数,一个Acceptor对象是用来管理监听的fd的, 一个fd对应了一个Channel。如果你要具体实现成指针的话,需要在构造函数里面new 一个channel对象。这里为了方便,就直接定义成channel对象。而那个EventLoop为什么用指针,那是因为那个loop是在tcpserver里面实例化的,主线程是负责来监听的。

 _channel.SetReadCallBack(std::bind(&Acceptor::HandlerRead, this));这个该怎么理解 

什么是读事件发生呢? 读事件就绪指的是客户端还是服务端的读事件就绪了?

 就好比我现在命令去检测8080端口号,当有客户端连接到8080,这个时候就说明监听套接字读事件就绪了

  • 当有新客户端尝试连接到这个8080端口时,监听socket的"读事件就绪"表示有新的连接请求待处理
  • 这时可以调用accept()函数来接受这个新连接而不会阻塞

所以在Acceptor类中:

  1. _listen_socket是监听socket
  2. _channel监控这个socket的读事件
  3. 当有客户端连接请求到达8080端口时,_listen_socket的读事件就绪
  4. 系统通知EventLoop
  5. EventLoop调用_channel注册的回调函数(即Acceptor::HandlerRead)
  6. HandlerRead函数会执行accept()来接受新连接

这种机制是基于I/O多路复用(如select、poll、epoll)实现的,让服务器能够处理多个连接而不需要为每个连接创建一个线程。

所以是的,读事件就绪是指服务器的监听socket检测到有客户端连接请求到来,可以无阻塞地进行accept操作了。

对于void SetAcceptCallback(const AcceptCallback& cb)的理解

如何用生活中的例子去理解Acceptor模块?

http://www.dtcms.com/a/491413.html

相关文章:

  • asp.net做三个网站官网搭建
  • xr-frame微信小程序xr-ar-tracker实现video视频竖屏或横屏播放
  • JavaScript this 关键字详解
  • 镇江网站制作服务网站功能插件
  • 假电影网站做注册静态网站建设背景
  • 如何利用云服务器进行网站建设厦门网站优化服务
  • 【 广州产权交易所-注册安全分析报告-无验证方式导致安全隐患】
  • MySQL 高级分表与分库实践指南
  • SEO网站建设入驻程流旅游网站这么做
  • 网站怎么响应式布局建筑资源网站
  • 从 ROS 订阅视频话题到本地可视化与 RTMP 推流全流程实战
  • JavaScript 中的安全编码:10 个关键实践
  • 可变参数模版bug(报错原因分析:参数包未正确 “展开”)
  • Python | 班级成绩数据管理系统 分步详解
  • 笔试强训(三)
  • 房地产行业网站开发网站开发业务需求分析
  • 青岛seo精灵黑帽seo排名
  • 悟空AI CRM:合同功能,数字化合同管理的高效助手
  • 昆山建设公司网站监控视频怎么做直播网站
  • 第三章 线型神经网络
  • 【51单片机】【protues仿真】基于51单片机数字温度计数码管系统
  • 【Redis】缓存热点数据
  • 网站建设 无法打开asp青岛有没有做网站的
  • Playwright Fixture 实战:模拟数据库、API客户端与测试数据
  • wordpress分类栏目昆明排名seo公司
  • 海南蓝碳:生态财富与科技驱动的新未来
  • 济源网站建设哪家好网站开发命名规则
  • CentOS 7上Python3.10报错 No module named ‘_ssl‘
  • h5游戏免费下载:街头篮球
  • 南京百度网站建设南充市网站建设