iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计
  • 168
分享到

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

服务器c++java 2023-10-21 08:10:10 168人浏览 独家记忆
摘要

项目完整版在: 文章目录 一、channel模块:事件管理Channel类实现二、提供的功能三、实现思想(一)功能(二)意义(三)功能设计 四、代码(一)框架(二)完整 一、cha

项目完整版在:

文章目录

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

在这里插入图片描述

二、提供的功能

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

三、实现思想

(一)功能

Socket套接字的操作进行封装。

(二)意义

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

(三)功能设计

对监控事件的管理
描述符是否可读
描述符是否可写
对描述符监控可读
对描述符监控可写
解除可读事件监控
解除可写事件监控
解除所有事件监控
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();        }};

来源地址:https://blog.csdn.net/weixin_54447296/article/details/133439943

--结束END--

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

本文链接: https://www.lsjlt.com/news/433514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作