1.10.C++项目:仿muduo库实现并发服务器之Acceptor模块的设计

news2024/11/28 22:49:22

一、Acceptor模块:这是一个对于通信连接进行整体管理的一个模块,对一个连接的操作都是通过这个模块来进行!

在这里插入图片描述

二、提供的功能

Acceptor模块是对Socket模块,Channel模块的⼀个整体封装,实现了对⼀个监听套接字的整体的管
理。

三、实现思想

(一)功能

  1. 实现向Channel提供可读事件的IO事件处理回调函数,函数的功能其实也就是获取新连接。
  2. 为新连接构建⼀个Connection对象出来。

(二)意义

当获取了一个新建连接的描述符后,需要为这个通信连接,封装一个connection对象,设置不同回调。
注意:因为Acceptor模块本身并不知道一个链接产生了某个事件该如何处理,因此获取一个通信连接后,Connection的封装,以及事件回调的设置都应该由服务器模块来进行!

(三)功能设计

回调函数设置——新建连接获取成功的回调设置,由服务器来指定!

四、框架

/*
Acceptor 模块,对监听套接字进行管理!
        1. 创建一个监听套接字
        2. 启动读事件监控
        3. 事件触发后,获取新连接
        4. 调用新连接获取成功后的回调函数!
                4. 为新连接创建Connection进行管理(这一步不是Acceptor模块操作,应该是服务器模块)
        因为Acceptor模块只进行监听连接的管理,因此获取到新连接的描述符后,对于新连接描述符如何处理并不关心!
        对于新连接如何处理,应该是服务器模块关心管理!
        服务器模块,实现了一个对于新连接描述符处理的函数,将这个函数设置给Acceptor模块的回调函数!
*/

五、代码

class Acceptor {
        private:
                Socket _socket; // 用于创建监听套接字
                EventLoop *_loop;  // ⽤于对监听套接字进⾏事件监控
                Channel _channel;  // ⽤于对监听套接字进⾏事件管理
                using AcceptCallback = std::function<void(int)>;
                AcceptCallback _accept_callback;
        private:
        /*监听套接字的读事件回调处理函数---获取新连接,调⽤_accept_callback函数进⾏新连接处理*/ 
                void HandleRead() {
                        int newfd = _socket.Accept();
                        if (newfd < 0) {
                                return ;
                        }
                        if (_accept_callback) _accept_callback(newfd);
                }
                int CreateServer(int port) {
                        bool ret = _socket.createServer(port);
                        assert(ret == true);
                        return _socket.Fd();
                }
        public:
        /*不能将启动读事件监控,放到构造函数中,必须在设置回调函数后,再去启动*/
        /*否则有可能造成启动监控后,⽴即有事件,处理的时候,回调函数还没设置:新连接得不到处理,且资源泄漏*/
                Acceptor(EventLoop* loop,int port) : _socket(createServer(port)),_loop(loop),_channel(loop,_socket.Fd()) {
                        _channel(loop, _socket.Fd()) {
                        _channel.SetReadCallback(std::bind(&Acceptor::HandleRead, this));
                }
                void SetAcceptCallback(const AcceptCallback &cb) { 
                        _accept_callback = cb; 
                }
                void Listen() {
                        _channel.EnableRead(); 
                }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国人民大学与加拿大女王大学金融硕士-----成功便是站起来比倒下多一次

人生说短也短&#xff0c;说长也长。在有限的时间内&#xff0c;让我们按下“加速键”&#xff0c;收获生活或工作中的各种美好。人生的每一次加速&#xff0c;都距未来更近一步。身处金融领域的你&#xff0c;有想到比别人更快一步的拿到学位吗&#xff1f;中国人民大学与加拿…

yolov5加关键点回归

文章目录 一、数据1&#xff09;数据准备2&#xff09;标注文件说明 二、基于yolov5-face 修改自己的yolov5加关键点回归1、dataloader,py2、augmentations.py3、loss.py4、yolo.py 一、数据 1&#xff09;数据准备 1、手动创建文件夹: yolov5-face-master/data/widerface/tr…

K8S:K8S对外服务之Ingress

文章目录 一.Ingress基础介绍1.Ingress概念2.K8S对外暴露服务&#xff08;service&#xff09;主要方式&#xff08;1&#xff09;NodePort&#xff08;2&#xff09;LoadBalancer&#xff08;3&#xff09;externalIPs&#xff08;4&#xff09;Ingress 3.Ingress 组成&#x…

JS进阶-原型

原型 原型就是一个对象&#xff0c;也称为原型对象 构造函数通过原型分配的函数是所有对象所共享的 JavaScript规定&#xff0c;每一个构造函数都有一个prototype属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象 这个对象可以挂载函数&#xff0c;对象实…

8 个 Promise 高级用法

在 js 项目中&#xff0c;promise 的使用应该是必不可少的&#xff0c;但我发现在同事和面试者中&#xff0c;很多中级或以上的前端都还停留在promiseInst.then()、promiseInst.catch()、Promise.all等常规用法&#xff0c;连async/await也只是知其然&#xff0c;而不知其所以然…

Vue3实现div拖拽改变宽高

效果图如下&#xff1a; 底部拖拽按钮点击拖拽可自定义父容器的宽高 <template><div id"business_plane"><div class"business_plane" ref"container"><div class"darg_tool"><el-icon class"drag_H…

JavaEE初阶学习:HTTP协议和Tomcat

1. HTTP协议 HTTP协议是一个非常广泛的应用层协议~~ 应用层协议 —> TCP IP 协议栈 应用层 —> 关注数据怎么使用~ 传输层 —> 关注的是整个传输的起点和终点 网络层 —> 地址管理 路由选择 数据链路层 —> 相邻节点之间的数据转发 物理层 —> 基础设置,硬…

Rocky(centos)安装nginx并设置开机自启

一、安装nginx 1、安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、去官网下载最新的稳定版nginx nginx: downloadhttp://nginx.org/en/download.html 3、将下载后的nginx上传至/usr/local下 或者执行 #2023-10-8更新 cd /usr/…

我在 NPM 发布了新包: con-colors

链接地址&#xff1a;npmjs.com con-colors 安装依赖 yarn add con-colors使用 导入&#xff1a; import { print } from "con-colors";使用&#xff1a; print.succ("成功的消息"); print.err("失败的消息")例子&#xff1a; import { p…

与诈蟹的初次邂逅,你中招了没

中秋国庆双节大家都过得怎么样&#xff1f;有没有吃到螃蟹&#xff1f;不管你们吃没吃到&#xff0c;反正东东是吃到螃蟹...的瓜了&#xff0c;四舍五入一下也算是吃到了吧。 这不节后上班第一天&#xff0c;同事们就已经开始互相问候关于是否收到蟹卡的情况&#xff0c;一开始…

vmware一键启动虚拟机系统脚本

bat脚本 "D:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "D:\Program Files (x86)\Ginkgo7000\C7-10.10.10.111\CentOS 7-NAS-6.vmx" 脚本内容说明 "D:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe"…

一般香港服务器带宽选多大够用?(带宽计算方法)

​  在海外IDC市场份额中&#xff0c;香港服务器依托自身优越的服务器资源条件&#xff0c;在各个行业中发挥的重要作用。但是&#xff0c;不同业务对网络带宽的要求各不相同&#xff0c;弄清楚如何计算带宽需求对于确保业务平稳运行至关重要&#xff0c;最好从一开始就使用正…

研发质量管理体系

研发质量管理体系的脉络是怎样的&#xff1f;如何建立适合组织发展的研发质量管理体系&#xff1f;质量管理的核心是什么&#xff1f;一些思考&#xff0c;一些线索&#xff0c;欢迎朋友们一起探讨、碰撞。

Tensorflow入门之 Hello World

Tensorflow入门之 Hello World 简介 Tensorflow 是 Google 开源的深度学习框架&#xff0c;来自于 Google Brain 研究项目&#xff0c;在 Google 第一代分布式机器学习框架 DistBelief 的基础上发展起来。 Tensorflow 的官方网址 http://www.tensorflow.org Tensorflow 的 G…

基于Spring Boot和WebSocket的在线聊天室测试

1.测试目标 设计可靠且全面的自动化测试用例&#xff0c;以覆盖项目的核心功能以及不同的使用场景。通过有效的测试策略和测试工具选择&#xff0c;提高测试效率&#xff0c;减少手动测试所需的工作量&#xff0c;从而加速项目的交付周期。保障持续集成与持续交付流程的顺利进…

保护数据安全:防病毒防木马的重要性与策略

随着科技的进步&#xff0c;我们的生活已经离不开互联网。网络为我们的工作、学习、娱乐带来了极大的便利&#xff0c;但同时也带来了新的挑战——数据安全问题。病毒、木马等恶意软件&#xff0c;是威胁数据安全的主要因素。因此&#xff0c;我们必须采取有效的防病毒防木马措…

react中预览excel表格

查了很多资料&#xff0c;很多插件&#xff0c;有很多也用不了&#xff0c;最后试了xlsx这个插件&#xff0c;可以使用。 话不多少了&#xff0c;直接放代码吧&#xff1a; 1.代码实现 fetch(API).then((res: any) > {res?.blob().then((r: any) > {const reader ne…

论文降重:我从论文重复率75%降到4.5%,顺利毕业

去年我在撰写毕业论文的过程中遇到了一个巨大的挑战&#xff0c;那就是论文的重复率过高&#xff0c;高达75%。这个问题严重威胁着我的学位和未来职业发展&#xff0c;因此我决定付出一切努力来解决这个难题。在花费大量时间和努力后&#xff0c;并借助智元兔AI写作助手(http:/…

【高效办公_PDF】如何快速批量整合多个PDF???---Python方法

高效办公 PDF 如何快速批量整合多个PDF??? 今日方法:如何使用Python代码实现合并当前目录PDF文件 市场上当然有许许多多的形形色色的软件可以进行PDF整合等操作; 那么我们用代码(r如:python怎么实现高效办公呢? ) # [注] 在合并过程中,程序是按照所在文件夹的存放顺…

Javascript 笔记:函数调用与函数上下文

在 JavaScript 中&#xff0c;函数上下文通常指的是函数在执行时的当前对象的引用&#xff0c;这通常用 this 关键字表示。this 关键字在不同的执行上下文中可能引用到不同的对象。 1 全局上下文 当 this 关键字用在全局上下文&#xff08;不在任何函数内部&#xff09;&#…