10. C++异步IO处理库和使用libevent实现高性能服务器

C++比较有名的异步IO处理库

  • libevent
    这个主要使用的是epoll。
  • libevthp
  • libuv
  • libev
    我们主要介绍libevent。

libevent重要函数

event_base_new

这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列,栈,都是可以初始化的。
函数原型
原型:struct event_base *event_base_new(void);
函数实现

struct event_base *event_base_new(void)
{struct event_base *base = NULL;struct event_config *cfg = event_config_new();if (cfg) {base = event_base_new_with_config(cfg);event_config_free(cfg);}return base;
}

函数作用
创建event_base对象
注意:采用event_base_new( )创建出来的事件集合,最后要用 event_base_free(base)释放掉,因为event_base_new( )是在堆空间上进行创建的。

event_base_new( )与event_init( )的区别
这两个函数都会创建一个事件集合
event_init( )创建的是一个全局的事件集合
event_base_new( )创建的是一个局部的事件集合
event_init( )函数实现是由event_base_new( )封装而成的

event_base_free( )

函数:释放事件集合
用于释放event_base_new( )函数创建的集合

event_base_dispatch

对应于epoll中的epoll_wait。在epoll_wait中可以收集所有的触发的文件描述符。

event new、event add、event del、event free

这三个就是对应于epoll_ctl 用于将事件加入、删除到libevent中。

event new

创建一个事件对象

event add

函数原型:int event_add(struct event *ev, const struct timeval *tv);。将该事件加入到libevent集合中。
函数作用
1.将event注册到event_base的I/O多路复用要监听的事件中;
2.将event注册到event_base的已注册事件链表中;
3.如果传入了超时时间,则删除旧的超时时间,重新设置,并将event添加到event_base的小根堆中;
如果没有传入超时时间,则不会添加到小根堆中。
只有步骤1成功,才会执行步骤2和3;否则什么都没做,直接返回,保证不会改变event的状态。

event del

原型:event_del(struct event *ev);将该事件从libevent集合中删除

event free

释放该事件对象

event_init

函数原型:struct event_base *event_init(void)

event_set

初始化事件,函数原型
原型:void event_set(struct event *ev, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void *arg);
参数:
1)事件
2)关联的文件描述符
3)事件类型
4)回调函数
5)回调函数的参数
函数作用:
初始化event事件(其实就是给结构体ev的成员赋值)
fd 表示事件对应的文件描述符,
events表示事件的类型,
callback是回调函数(即当fd满足条件时调用该函数),
arg表示给回调函数传递的参数

一般首先要用event newnew一个事件。然后用event add将该事件加入到libevent中。用event del可以将该事件从libevent中删除。event free则是将该事件释放掉。

evconnlistener_new_bind( )函数

作用:用于创建一个evconnlistener对象的函数之一,用于监听指定地址和端口上的连接请求。

函数返回值为一个evconnlistener类型的指针,表示成功创建的监听器对象。当监听器接收到新连接时,将会调用回调函数cb,并将参数ptr传递给回调函数。

函数原型

struct evconnlistener *evconnlistener_new_bind(struct event_base *base,evconnlistener_cb cb,void *ptr,unsigned flags,int backlog,const struct sockaddr *sa,int socklen);

参数介绍
1)base
struct event_base类型的指针,表示事件集合
2)cb
evconnlistener_cb类型的回调函数指针,用于处理新连接的事件。其中:evconnlistener_cb类型
在这里插入图片描述

typedef void ( *evconnlistener_cb)(struct evconnlistener *listener,evutil_socket_t fd,struct sockaddr *addr,int socklen,
void *ctx
);
其中,参数含义如下:
· listener:指向监听器的指针。
. fd:表示新连接的文件描述符。
. addr:指向新连接的远程地址。
. socklen:表示地址的长度。
. ctx:指向回调函数上下文的指针。
回调函数的返回值类型为void,即不需要返回任何值。

3)ptr
传递给回调函数的参数指针
4)flags
标志位,可以是LEV_OPT_REUSEABLELEV_OPT_CLOSE_ON_FREE等选项
其中:
LEV_OPT_REUSEABLE是libevent库中用于创建监听器的选项之一,用于指示创建的监听器是否可以重用。具体来说,当使用LEV_OPT_REUSEABLE选项创建监听器时,表示创建的监听器可以在关闭之后再次被使用。这意味着,当监听器关闭时,它并没有被完全销毁,而是被放置在一个可重用的状态中,以便在需要时可以被重新使用。这种方式可以提高应用程序的性能,因为不需要每次创建新的监听器。
LEV_OPT_CLOSE_ON_FREElibevent库中用于创建监听器的选项之一,用于指示在释放监听器时是否关闭监听器的文件描述符。具体来说,当使用LEV_OPT_CLOSE_ON_FREE选项创建监听器时,表示在释放监听器时,同时也会关闭监听器的文件描述符。这意味着,应用程序不需要显式地调用close()函数来关闭文件描述符,而是在释放监听器时自动关闭。这种方式可以减少应用程序的代码量,并提高代码的可读性和可维护性。
5)backlog:监听队列的长度。
6)sa:指向struct sockaddr类型的指针,表示要监听的地址和端口。
7)socklen:sa指向的地址结构体的长度。

libevent编译和安装

  1. http://libevent.org/
    首先进入这个网站,然后
  2. wget -c addr --no-check-certificate
  3. 进入该文件夹
    然后执行这个
    ./configure --prefix=/usr/local/libevent
  4. 执行这个
mkdir build && cd buildcmake .. -DEVENT__DISABLE_OPENSSL=ON -DEVENT__LIBRARY_TYPE=STATICmake && make install

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

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

相关文章

电脑重装系统的PE工具

10款PE制作工具!一键制作U盘启动盘,轻松制作系统盘,重装系统,免费纯净、无捆绑。 二、资源/简介 1.微PE工具箱 非常老牌的PE工具,装机维护得力的助手,最后的救命稻草。化繁为简,小材大用&…

【GPT‑4o】完整教程:LORA微调LLaMA3并结合RAG和Agent技术实现Text2SQL任务

完整教程:LORA微调LLaMA3并结合RAG和Agent技术实现Text2SQL任务 环境准备 首先,安装必要的Python包: pip install transformers peft datasets torch faiss-cpu加载LLaMA3模型 从Hugging Face加载LLaMA3模型和对应的tokenizer&#xff1a…

算法基础之集合-Nim游戏

集合-Nim游戏 核心思想: 博弈论 sg函数:在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,yk,定义SG(x)的后记节点y1,y2,,yk的SG函数值构成的集合在执行mex运算的结果,即:SG(x)mex({SG(y1),SG(y2)SG(yk)}) **特别地,**整个有向图…

Linux内核编译流程3.10

一、内核源代码编译流程 编译环境: cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) Linux内核版本: uname -r 3.10.0-693.el7.x86_64 编译内核源代码版本:linux-4.19.90-all-arch-master cp /boot/config-xxx到内核源…

数据库(9)——DQL基础查询

数据查询 数据查询是SQL中最复杂的,语法结构为 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后字段列表 ORDER BY 排序字段列表 LIMIT 分页参数 查询多个字段 SELECT 字段1,字段2...FROM…

领域驱动设计(DDD)学习笔记之:战略设计

限界上下文(Bounded Context) 上下文边界的确定 在领域驱动设计(DDD)中,限界上下文(Bounded Context)是定义领域模型边界的核心概念。明确和定义上下文边界是DDD战略设计中的重要步骤。正确地…

Spring Cloud:微服务架构的基石

目录 微服务架构简介 Spring Cloud 简介 Spring Cloud 组件详解 Eureka 服务注册与发现 Ribbon 负载均衡 Feign 声明式 HTTP 客户端 Hystrix 服务容错保护 Zuul 网关 Config 配置管理 Sleuth 链路追踪 Spring Cloud Stream 消息驱动 Spring Cloud 与 Docker 的结合 …

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]:以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同,最少操作…

linux开发之设备树基本语法一

设备树的根节点 设备树子节点和子子节点,子节点在根节点范围内 包含子节点以及子子节点 节点名称 比如这里led就是这个gpio的小名,可以直接用 gpio22020101是这里的名字,也就是要用这个gpio,符号后面的一串数字使用了这个gpio的寄存器地址,因为可能会用很多gpio,所以加入寄存…

Linux完整版命令大全(二十二)

uux 功能说明&#xff1a;在远端的UUCP主机上执行指令。语  法&#xff1a;uux [-bcCIjlnrvz][-a<地址>][-g<等级>][-s<文件>][-x<层级>][--help][指令]补充说明&#xff1a;uux可在远端的UUCP主机上执行指令或是执行本机上的指令&#xff0c;但在执…

Pushmall共享分销电商SaaS版2024年 5月模块开发优化完成

Pushmall共享分销电商 2024年 5月模块开发优化完成 1、**实现SaaS框架业务&#xff1a;**多租户、多商家、多门店&#xff0c;及商家入驻、商品管理。 2、租户小程序管理&#xff1a;对租户的小程序业务管理。 3、店铺小程序管理&#xff1a;对租户多店铺小程序绑定。 4、会员分…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 在昨天的文章中&#xff0c;我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得&#xff0c;这只是AI 模型的一次错误判断&#xff0c;不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

精酿啤酒:品质与口感对啤酒市场价格的影响

啤酒作为一种大众化的产品&#xff0c;其品质与口感对市场价格有着显著的影响。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感又加上市场价格相对实惠&#xff0c;受到消费者的青睐。 品质是决定啤酒市场价格的重要因素。Fendi club啤酒选用天然小麦原料&am…

【leetcode2765--最长交替子数组】

要求&#xff1a;给定一个数组&#xff0c;找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路&#xff1a;用两层while循环&#xff0c;第一个while用来找到符合这个循环的开头位置&#xff0c;第二个用来找到该循环的结束位置&#xff0c;并比较一下max进行记录。 …

太速科技-16通道24bit 256kHZ 的振动信号千兆网络采集器

16通道24bit 256kHZ 的振动信号千兆网络采集器 一、产品概述 数据采集器是一台运行Linux操作系统的智能终端&#xff0c;在以太网络的支持下&#xff0c;可迅速构建起大规模的分布式智能数据采集系统。采集器终端体积小&#xff0c;功耗低&#xff0c;易集成&#xff0c…

ubuntu linux (20.04) 源码编译cryptopp库 - apt版本过旧

下载最新版 https://www.cryptopp.com/#download 编译安装&#xff1a; ​#下载Cryptopp源码 #git clone https://gitee.com/PaddleGitee/cryptopp.git#进入文件夹 cd cryptopp #编译&#xff0c;多cpu处理 make -j8 #安装&#xff0c;默认路径&#xff1a;/usr/local sudo m…

Apache Impala 4.4.0正式发布了!

历时半年多&#xff0c;Impala 4.4终于发布了&#xff01;本次更新带来了不少新功能&#xff0c;受限于篇幅&#xff0c;这里简要列举一些&#xff0c;后续文章再挑重点的进行介绍。 支持更多Iceberg表上的语句 支持对 Iceberg V2 表的 UPDATE 语句&#xff0c;用来更新已有数…

解析新加坡裸机云多IP服务器网线路综合测评解析

在数字化高速发展的今天&#xff0c;新加坡裸机云多IP服务器以其卓越的性能和稳定性&#xff0c;成为了众多企业和个人用户的首选。源库主机评测将对新加坡裸机云多IP服务器的网线路进行综合测评&#xff0c;以帮助读者更深入地了解这一产品的优势。 一、性能表现 新加坡裸机云…

代码随想录算法训练营第四十三天 动态规划 part05● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;主要是要找到两个近似相等的子集和&#xff0c;去求这两个和的最小值; 之后就是和从子集中找相对应和的思路是一样的了 注意点&#xff1a;1&#xff09;dp 初始…

【RocketMQ】安装RocketMQ5.2.0(单机版)

下载 官网下载地址&#xff1a;下载 | RocketMQ github地址&#xff1a;Tags apache/rocketmq GitHub 选择对应的版本下载。https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip 5.2.0的二进制包&#xff1a;下载地址 5.2.0的…