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

这篇具有很好参考价值的文章主要介绍了1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目完整版在:

一、channel模块:事件管理Channel类实现

1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计,CodeCrafters,服务器,c++,java

二、提供的功能

1.对监控事件的管理
描述符是否可读
描述符是否可写
对描述符监控可读
对描述符监控可写
解除可读事件监控
解除可写事件监控
解除所有事件监控
2.对监控事件触发后的处理
设置对于不同事件的回调处理函数
明确触发了某个事件该如何处理文章来源地址https://www.toymoban.com/news/detail-716723.html

三、实现思想

(一)功能

对socket套接字的操作进行封装。

(二)意义

对socket套接字的操作进行封装。

(三)功能设计

1.对监控事件的管理
描述符是否可读
描述符是否可写
对描述符监控可读
对描述符监控可写
解除可读事件监控
解除可写事件监控
解除所有事件监控
2.对监控事件触发后的处理
设置对于不同事件的回调处理函数
明确触发了某个事件该如何处理

四、代码

(一)框架

class Channel {

        private:
                int _fd;
                uint32_t events;  // 当前需要监控的事件
                uint32_t revents; // 当前连接触发的事件
                using eventCallback = std::function<void()>>;
                eventCallback _read_callback;  // 可读事件被触发的回调函数
                eventCallback _error_callback; // 可写事件被触发的回调函数
                eventCallback _close_callback; // 连接关闭事件被触发的回调函数
                eventCallback _event_callback; // 任意事件被触发的回调函数
                eventCallback _write_callback; // 可写事件被触发的回调函数
        public:
                Channel(int fd) : fd(_fd) {}
                int Fd() {return _fd ;}
                void setReadCallback(const eventCallback &cb);
                void setWriteCallback(const eventCallback &cb);
                void setErrorCallback(const eventCallback &cb);
                void setCloseCallback(const eventCallback &cb);
                void setEventCallback(const eventCallback &cb);
                bool readAble();   // 当前是否可读
                bool writeAble();  // 当前是否可写
                void enableRead(); // 启动读事件监控
                void enableWrite(); // 启动写事件监控
                void disableRead();     // 关闭读事件监控
                void disableWrite(); // 关闭写事件监控
                void disableAll();  // 关闭所有事件监控
                void Remove();  //移除监控
                void handleEvent(); // 事件处理,一旦触发了某个事件,就调用这个函数!

};

(二)完整

class Channel {

        private:
                int _fd;
                uint32_t events;  // 当前需要监控的事件
                uint32_t revents; // 当前连接触发的事件
                using eventCallback = std::function<void()>>;
                eventCallback _read_callback;  // 可读事件被触发的回调函数
                eventCallback _error_callback; // 可写事件被触发的回调函数
                eventCallback _close_callback; // 连接关闭事件被触发的回调函数
                eventCallback _event_callback; // 任意事件被触发的回调函数
                eventCallback _write_callback; // 可写事件被触发的回调函数
        public:
                Channel(int fd) : fd(_fd) {}
                int Fd() {return _fd ;}
                void SetRevents(uint32_t events) {_revents = events; }
                void setReadCallback(const eventCallback &cb) { _read_callback = cb;}
                void setWriteCallback(const eventCallback &cb) { _write_callback = cb; }
                void setErrorCallback(const eventCallback &cb) { _error_callback = cb; }
                void setCloseCallback(const eventCallback &cb) { _close_callback = cb; }
                void setEventCallback(const eventCallback &cb) { _event_callback = cb; }
                bool readAble() {  // 当前是否可读 
                        return (_events & EPOLLIN);
                }
                bool writeAble() {  // 当前是否可写
                        return (_events & EPOLLOUT);
                }
                void enableRead() {// 启动读事件监控
                        _events |= EPOLLIN; // 后面会添加到EventLoop的事件监控!
                }
                void enableWrite() { // 启动写事件监控 
                        _events |= EPOLLOUT; // 后面会添加到EventLoop的事件监控!
                }
                void disableRead() {    // 关闭读事件监控
                        _events &= ~EPOLLIN;   // 后面会修改到EventLoop的事件监控!
                }
                void disableWrite() { // 关闭写事件监控 
                        _events &= ~EPOLLOUT;
                }
                void disableAll() { // 关闭所有事件监控
                        _events = 0;
                }
                void Remove();  // 后面会调用EventLoop接口移除监控
                void HandleEvent() {
                        if ((_revents & EPOLLIN) || (_revents & EPOLLRDHUP) || (_revents & EPOLLPRI)) {
                        
                                if (_read_callback) _read_callback();
                                }
                        /*有可能会释放连接的操作事件,一次只处理一个*/
                                if (_revents & EPOLLOUT) {
                                if (_write_callback) _write_callback();
                                }
                                else if (_revents & EPOLLERR) {
                                if (_error_callback) _error_callback();//一旦出错,就会释放连接,因此要放到前边调用任意回调
                                }else if (_revents & EPOLLHUP) {
                                if (_close_callback) _close_callback();
                                }
                        /*不管任何事件,都调用的回调函数*/
                        if (_event_callback) _event_callback();
        }

};

到了这里,关于1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计

    添加请求—— 处理函数映射信息(GET/POST/PUT/DELETE) 设置静态资源根目录 设置是否启动超时连接关闭 设置线程池中线程数量 启动服务器 OnConnected - 用于给TcpServer设置协议上下文 OnMessage - 用于进行缓冲区数据解析处理 获取上下文,进行缓冲区数据对象 请求的路由查 找 静态资

    2024年02月07日
    浏览(55)
  • 【项目设计】仿 muduo 库实现 OneThreadOneEventLoop 式并发服务器

    本项目主要是模仿 muduo 库实现一个以主从 Reactor 为模型,以 OneThreadOneEventLoop 为事件驱动的高并发服务器组件。通过这个服务器组件,我们可以简洁快速的搭建出一个高性能的 TCP 服务器。并且组件内部会提供不同的应用层协议支持,组件使用者可以通过这些协议快速的完成

    2024年04月23日
    浏览(68)
  • 一、C++项目:仿muduo库实现高性能高并发服务器

    仿mudou库one thread oneloop式并发服务器实现 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器: 通过实现的高并发服务器组件,可以简洁快速的完成一个高性能的服务器搭建。并且,通过组件内提供的不同应用层协议支持,也可以快速完成一个高性能应用服务器的搭建

    2024年02月07日
    浏览(51)
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)Channel 模块的实现

    在这篇文章中虽然实现了能够和多客户端建立连接,并且同时和多个客户端进行通信。 基于多反应堆的高并发服务器【C/C++/Reactor】(上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/135141316?spm=1001.2014.3001.5501 但是有一个 问题(O_O)? : 这个程序它是单线程的。如果我们想

    2024年02月03日
    浏览(58)
  • 仿muduo库实现one thread one loop式并发服务器

      文章目录 一、项目简介 二、项目整体认识 2、1 HTTP服务器 2、2 Reactor模型 三、预备知识 3、1 C++11 中的 bind 3、2 简单的秒级定时任务实现 3、3 正则库的简单使用 3、4 通用类型any类型的实现 四、服务器功能模块划分与实现 4、1 Buffer模块 4、2 Socket模块 4、3 Channel模块 4、

    2024年04月09日
    浏览(56)
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(下)重构Channel类

    一、C语言 Channel.h Channel.c 二、C++ Channel.h Channel.cpp  

    2024年01月21日
    浏览(70)
  • 基于muduo网络库实现的集群聊天服务器

    !!!项目是照着腾讯课堂施磊老师的视频学习,仅供个人学习记录使用!!! !!!项目是照着腾讯课堂施磊老师的视频学习,仅供个人学习记录使用!!! !!!项目是照着腾讯课堂施磊老师的视频学习,仅供个人学习记录使用!!! 使用muduo网络库搭建网络核心模块

    2024年04月26日
    浏览(38)
  • 【实战项目】c++实现基于reactor的高并发服务器

    基于Reactor的高并发服务器,分为反应堆模型,多线程,I/O模型,服务器,Http请求和响应五部分 ​全局 Channel 描述了文件描述符以及读写事件,以及对应的读写销毁回调函数,对应存储arg读写回调对应的参数 ​Channel 异或 |:相同为0,异为1 按位与:只有11为1,其它组合全部

    2024年02月12日
    浏览(53)
  • C++项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置

    今天开始想更新一个C++项目,实现一个 支持跨服务器通信、支持负载均衡的集群聊天服务器项目 。项目会应用muduo网络库、CMake编译、MySQL数据库、JSon序列化与反序列化、Redis消息订阅模式以及Nginx负载均衡功能。 有兴趣的宝可以跟我一起实操起来,巩固自己的C++学习吧~ 本项

    2024年04月14日
    浏览(62)
  • 模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

    目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. MemoryDataCenter单元测试 结语    

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包