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

【仿muduo库实现并发服务器】Acceptor模块

仿muduo库实现并发服务器

  • 1.Acceptor模块
  • 2.成员变量
  • 3.成员函数
    • 3.1私有成员函数(对内部提供的接口)
    • ①HandleRead()
    • ②CreateServer(port)
    • 3.2公有成员函数(向外提供的接口)
    • ①构造函数
    • ②设置成功获取连接之后的回调函数
    • ③启动读事件监控

1.Acceptor模块

Acceptor模块的功能是对监听套接字进行管理,里面要封装Socket模块,Channel模块,Eventloop模块。
主要流程:
1.首先要创建一个监听套接字连接
2.启动监听套接字的读事件监控
3.读事件就绪后就去获取新连接套接字
4.获取连接成功之后就调用对连接处理的回调函数。
(对新连接的操作:为新连接创建Connection进行管理…)
注意:acceptor模块它只关心获取连接,不关心获取成功后对新连接如果操作,对新连接如何操作是由服务器决定的。

对于新连接如何处理,是由服务器来管理的,所以服务器模块需要实现一个获取新连接套接字成功之后对新连接进行处理的函数,将这个函数设置给Acceptor模块中的回调函数。

2.成员变量

Acceptor是对监听套接字进行管理的,所以首先需要能够创建一个监听套接字(Socket),然后还需要对这个监听套接字进行读事件监控(EventLoop),读事件一旦就绪还需要执行读事件处理:获取连接套接字(Channel)。成功获取连接套接字之后需要对连接进行处理,所以还需要一个回调函数callback。
所以需要四个变量

private:Socket _socket;//用于创建监听套接字以及后续获取新连接操作EventLoop *_loop;//用于监听套接字的读事件监控Channel _channel;//用于监听套接字的事件管理(读事件就绪做什么)using NewLinkCallback=std::function<void(int)>;NewLinkCallback _newlink_callback;//对新连接的后续操作回调函数

3.成员函数

3.1私有成员函数(对内部提供的接口)

①HandleRead()

连接一般在构造时就将channel各种事件回调函数设置进去了,所以我们在这里需要提供监听套接字读就绪之后该怎么处理操作,以便在构造时,设置进去。
监听套接字读就绪要做什么呢?很简单,就是获取新的套接字,然后调用新连接获取成功之后的处理回调函数。

②CreateServer(port)

在创建套接字连接时是一步到位的,只不过需要传入对应的端口号。Socket里面是封装好的。
因为channel初始化时是需要两个参数一个是绑定的eventloop,一个是对应的套接字,而想要获取套接字,就必须要先创建套接字,创建套接字连接只能在函数体中进行,那这样channel就无法初始化了。
所以我们封装一下接口,先在初始化列表中创建处监听套接字,这样channel就能获取到套接字了。

int CreateServer(uint16_t port){//创建监听套接字bool ret=_socket.CreateServer(port);assert(ret==true);return _socket.Fd();}

3.2公有成员函数(向外提供的接口)

①构造函数

在初始化列表中已经将套接字连接创建出来了,成员变量也初始化了,就差将监听套接字对应的channel的读事件回调函数设置进去了。构造时只要传入要绑定的Eventloop,和要连接的服务器端口号。所以Acceptor对象构建好,就代表着监听套接字连接已经创建成功,并将设置了channel读事件就绪处理回调函数。

public:Acceptor(EventLoop* loop,uint16_t port):_socket(CreateServer(port)),_loop(loop),_channel(loop,_socket.Fd()){//设置监听套接字的读事件就绪回调函数_channel.SetReadCallback(std::bind(&Acceptor::HandleRead,this));}

还要注意监听套接字的读事件监听不能放在构造函数中执行,因为会存在刚创建好监听套接字连接,并且启动了读事件监控,同时读事件也就绪了,调用读事件回调函数,获取新连接,但是这个时候服务器对新连接的操作回调函数还没有设置进去,监听套接字的读事件回调函数就只会获取新连接,然后调用空的回调函数,什么都不干。
所以启动监听套接字读事件监控,必须放在服务器设置好获取连接之后回调函数后面。

②设置成功获取连接之后的回调函数

 void SetNewlinkCallback(const NewLinkCallback&cb){_newlink_callback=cb;}

③启动读事件监控

//不能让启动监控操作放入构造函数中,防止构造时就启动后监控,然后立刻读事件就绪了,这个时候服务器的新连接处理函数还没有设置进去//也就只获取到了新连接,没有对这个新连接进行后续操作,所以启动操作要放在设置回调函数之后void EnableListen(){_channel.EnableRead();}
http://www.lqws.cn/news/595279.html

相关文章:

  • 笔记/计算机网络
  • ChatGPT使用限额记录与插件统计
  • Softhub软件下载站实战开发(九):编写软件配置管理界面
  • Electron 应用打包与分发:从开发到交付的完整指南
  • Call、Apply、Bind详解
  • 如何进行Edge版本回退及禁用更新
  • 结构光相机:重塑工业自动化的“智慧之眼”,驱动智能制造新未来
  • 深度剖析:基于AOP、自定义注解与设计模式构建高度可定制的分布式锁解决方案
  • 亚马逊云科技中国峰会:数新智能CTO原攀峰详解一站式AI原生数智平台DataCyber在Amazon EKS的实践
  • 基于SSM万华城市货运服务系统的设计与实现
  • eNSP实验一:IPv4编址及IPv4路由基础
  • 新手向:从零开始Node.js超详细安装、配置与使用指南
  • 业务系统-AI 智能导航设计(系统设计篇 下)
  • 制作一款打飞机游戏74:游戏原型
  • 【仿muduo库实现并发服务器】LoopThreadPool模块
  • 第八十六篇 大数据排序算法:从厨房整理到分布式排序的智慧
  • 复合型浪涌保护器五大核心技术重构电气防护体系
  • 智慧医疗的定义与作用
  • 【QT】TXT电子书语音朗读器开发(2)
  • A模块 系统与网络安全 第三门课 网络通信原理-3
  • STM32F103_Bootloader程序开发10 - 实现IAP通讯看门狗与提升“跳转状态机”的健壮性
  • 达梦数据库配置SYSDBA本地免密登录
  • langchain从入门到精通(三十三)——RAG优化策略(九) MultiVector实现多向量检索文档
  • 在识IO函数
  • Day 3:Python模块化、异常处理与包管理实战案例
  • 比Axure更简单?墨刀高保真原型交互“监听变量”使用教程
  • 【Axure视频教程】大小图轮播
  • 应用场景全解析:飞算 JavaAI 的实战舞台
  • 星璇抽奖测试报告
  • 开源模型应用落地-OpenAI Agents SDK-集成Qwen3-8B-探索input_guardrail 的创意应用(五)