基于多反应堆的高并发服务器【C/C++/Reactor】(下)重构Channel类

一、C语言

  • Channel.h
#pragma once
#include <stdbool.h>
// 定义函数指针
typedef int(*handleFunc)(void* arg);// 定义文件描述符的读写事件
enum FDEvent {TimeOut = 0x01,ReadEvent = 0x02,WriteEvent = 0x04
};struct Channel {// 文件描述符int fd;// 事件int events;// 回调函数handleFunc readCallback;// 读回调handleFunc writeCallback;// 写回调handleFunc destroyCallback;// 销毁回调// 回调函数的参数void* arg;
};// 初始化一个Channel 
struct Channel* channelInit(int fd, int events, handleFunc readFunc, handleFunc writeFunc,handleFunc destroyFunc, void* arg);// 修改fd的写事件(检测 or 不检测)
void writeEventEnable(struct Channel* channel, bool flag);// 判断是否需要检测文件描述符的写事件
bool isWriteEventEnable(struct Channel* channel);
  • Channel.c
#include "Channel.h"
#include <stdlib.h>struct Channel* channelInit(int fd, int events, handleFunc readFunc, handleFunc writeFunc, handleFunc destroyFunc, void* arg) {struct Channel* channel = (struct Channel*)malloc(sizeof(struct Channel));channel->fd = fd;channel->events = events;channel->readCallback = readFunc;channel->writeCallback = writeFunc;channel->destroyCallback = destroyFunc;channel->arg = arg;return channel;
}void writeEventEnable(struct Channel* channel, bool flag) {if(flag) {channel->events |= WriteEvent;}else{channel->events = channel->events & ~WriteEvent;}
}bool isWriteEventEnable(struct Channel* channel) {return channel->events & WriteEvent;
}

二、C++

  • Channel.h
#pragma once
#include <stdbool.h>
// 定义函数指针
// typedef int(*handleFunc)(void* arg);
using handleFunc = int(*)(void* arg);// 定义文件描述符的读写事件 (强类型枚举)
enum class FDEvent {TimeOut = 0x01,ReadEvent = 0x02,WriteEvent = 0x04
};class Channel 
{
public:Channel(int fd, int events, handleFunc readFunc, handleFunc writeFunc,handleFunc destroyFunc, void* arg);// 回调函数handleFunc readCallback;// 读回调handleFunc writeCallback;// 写回调handleFunc destroyCallback;// 销毁回调// 修改fd的写事件(检测 or 不检测)void writeEventEnable(bool flag);// 判断是否需要检测文件描述符的写事件bool isWriteEventEnable();// 取出私有成员的值inline int getEvent() {return m_events;}inline int getSocket() {return m_fd;}inline const void* getArg() {return m_arg;}
private:// 文件描述符int m_fd;// 事件int m_events;// 回调函数的参数void* m_arg;
};
  • Channel.cpp 
#include "Channel.h"
#include <stdlib.h>Channel::Channel(int fd, int events, handleFunc readFunc, handleFunc writeFunc, handleFunc destroyFunc, void* arg) {m_fd = fd;m_events = events;m_arg = arg;readCallback = readFunc;writeCallback = writeFunc;destroyCallback = destroyFunc;
}void Channel::writeEventEnable(bool flag) {if(flag) {m_events |= static_cast<int>(FDEvent::WriteEvent);}else{m_events = m_events & ~static_cast<int>(FDEvent::WriteEvent);}
}bool Channel::isWriteEventEnable() {return m_events & static_cast<int>(FDEvent::WriteEvent);
}

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

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

相关文章

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处&#xff0c;将连接跟踪信息记录在报文上&#xff0c;在出口进行confirm.确认后的连接信息 本文以一个本机上送…

【MATLAB】CEEMDAN+FFT+HHT组合算法

代码原理 集成经验模态分解&#xff08;CEEMDAN&#xff09;是一种信号处理方法&#xff0c;旨在将非线性和非平稳信号分解为本质模态函数&#xff08;IMF&#xff09;。这种方法通过对信号进行多轮迭代&#xff0c;结合了噪声干扰的累计退化&#xff0c;从而更好地处理了信号…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

python日志模块,按天自动切换

import logging from logging.handlers import TimedRotatingFileHandlerclass TimedRotatingLogger:def __init__(self, name, log_dir, levellogging.INFO):# 创建一个loggerself.logger logging.getLogger(name)self.logger.setLevel(level)# 创建一个handler&#xff0c;用…

计算机网络技术-2022期末考试解析

【前言】 这是计算机网络技术这门课&#xff0c;感觉和计网还是有不一样的&#xff0c;但也有能做的&#xff0c;把能做的做了。 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1. 用于测试两台计算机连通状况的命令是 。 ( ) A. cmd B. ping C. ipconf…

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版&#xff0c;广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Web服务器软件&#xff1a;CentOS自带了Apache HTTP服务器软件&#xff0c;您可以使用以下命令安装它&#xff1…

操作系统期末提纲

操作系统期末提纲 文章目录 操作系统期末提纲第一章 计算机系统概述第二章 操作系统概述第三章 进程描述和控制第四章 线程第五章 并发性: 互斥和同步第六章 并发性:死锁和饥饿第七章 内存管理第八章 虚拟内存第九章 单处理器调度第十一章 I/O管理和磁盘调度第十二章 文件管理 …

Go 知多少?

作为一名已接触过其他语言的开发&#xff0c;再去学习一门新语言可比之前轻松不少&#xff0c; 语言之间存在很多相似点&#xff0c;但是新语言也有自己的不同点&#xff0c;通常我会先了解它与其他语言常遇到的不同点有哪些&#xff0c; 使自己先能够上手编写基础程序&#…

pytorch多GPU并行DistributedDataParallel应用和踩坑记录(本节-单机多卡实现)持续补充

一、 前言 说在前面&#xff1a;网上参考链接很多&#xff0c;参考之后可以实现分布式&#xff0c;但是对其原理还是云里雾里&#xff0c;有时间的建议去看一看原理。并且我实现分布式之后还是显示显存不足&#xff0c;不知道为什么。 参考链接&#xff1a;pytorch多GPU并行训…

业务题day01

1-1 请说一下你项目中是如何进行项目管理和发布的 我们项目使用的是Gogs进行代码托管&#xff0c;Jenkins进行项目自动运维发布。 在我们的项目中&#xff0c;我们使用Gogs进行代码托管和版本控制&#xff0c;以确保团队成员可以协同开发和管理代码。 Gogs是一个轻量级的、开…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

DNS 正/反向解析 主从复制 分离解析

一 DNS概念它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网 每一台 DNS 服务器都只负责管理一个有限范围 根域: 全球根服务器节点只有13个,10个在美国&#xff0c;1个荷兰&#xff0c;1个瑞典&#xff0c;1个日本 一级域名&#xff…

20. 完整的蒙特卡洛强化学习算法

文章目录 1. 回顾2. 约定3. MC强化学习环境对象的表示4.MC强化学习算法的表示5. MC方法的进一步分类 1. 回顾 第16篇给出了强化学习算法框架&#xff0c;随后的第17、18篇给出了该框架下如何进行策略评估以估计出Q ( s , a ) (s,a) (s,a)&#xff0c;第19篇给出了该框架下如何…

Java的四种访问权限修饰符

提示&#xff1a;对访问权限修饰符理解&#xff0c;最好的方法就是写代码进行测试。 Java的四种访问权限修饰符 一、四种访问权限1.对于类来说2.对于类成员来说 二、关于继承的一些规则三、总结 一、四种访问权限 Java 借助 private、protected、public与默认修饰符来控制类和…

【已解决】C语言实现多线程的同步与异步

说真的写了这篇博文时&#xff0c;才知道c语言本身不支持多线程&#xff0c;而是一些windowsapi让c语言拥有多线程的能力&#xff0c;那下面内容就以打开对话框为例&#xff0c;展现如何实现多线程的同步与异步。 文章目录 问题起源c语言多线程同步方案c语言多线程异步方案总结…

Typora使用及Markdow学习笔记1

编程如画&#xff0c;我是panda&#xff01; 最近有在学习Markdown&#xff0c;所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

【Linux运维】LVM和RAID学习及实践

LVM和RAID学习及实践 背景LVM简介新加硬盘的操作RAID-磁盘阵列应用场景RAID0RAID1其他结构RAID制作RAID 小结 背景 某台服务器的磁盘管理需要自己动手处理&#xff0c;找了一些资料也踩了一些坑&#xff0c;在这里记录一下&#xff0c;先介绍一下LVM和RAID这两个东西。在计算机…

【天龙八部】攻略day6

关键字&#xff1a; 灵武、寻宝要求、雁门 1】灵武选择 西凉枫林&#xff0c;锦带&#xff0c;短匕 白溪湖&#xff0c;明镜&#xff0c;双刺 竹海&#xff0c;玉钩&#xff0c;锁甲 2】楼兰寻宝需求 等级80级&#xff0c;40级前6本心法 3】雁门奖励 简单35*4元佑碎金 普…

慕尼黑工业大学最新提出!单目实时密集建图的混合隐式场方法

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 我们提出了一种新颖的方法&#xff0c;它将基于深度学习的密集SLAM与神经隐式场相结合&#xff0c;实时生成密集地图&#xff0c;而无需像以前的方法那样依赖RGB-…