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,一经查实,立即删除!

相关文章

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…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Apache Impala 4.4.0正式发布了!

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

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

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

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

下载 官网下载地址:下载 | RocketMQ github地址: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的二进制包:下载地址 5.2.0的…

设计模式:装饰模式(Decorator)

设计模式:装饰模式(Decorator) 设计模式:装饰模式(Decorator)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例模式扩展参考 设计…

Firefox浏览器网页上的按钮点击无效解决办法

我在github下点下载经常不好使,查了原因,原来是浏览器的问题。在Firefox浏览器的设置里面,去掉一些cookies的禁用即可。之后,就可以点击按钮成功响应了。

2024 全新 Javascript 面试题目基础篇

1. JavaScript 是单线程的吗? 没错,JavaScript 是 一种 单线程语言。这意味着它只有 一个调用栈和一个内存堆。每次只执行一组指令。 此外,JavaScript 是同步和阻塞 的性质。这意味着代码是逐行执行的,一个任务必须在下一个任务…

JVM的相关知识

目录 JVM内存划分 类加载过程 类加载中的“双亲委派模型” JVM内存划分 JVM也就是java进程。这个进程一旦跑起来之后,就会从操作系统里,申请一大块内存空间。JVM接下来就要进一步的对这个大的空间进行划分。划分成不同区域,从而每个区域都…

如何实时掌握手机号状态的API利器分析

在移动互联网的时代,手机号码不仅是通信的连接点,也是用户身份的关键识别。手机状态查询API 通过提供实时的手机号码状态查询服务,协助企业和组织更有效地管理用户信息,提升服务流程。 手机状态查询API 通过与电信运营商的数据库进…

Golang | Leetcode Golang题解之第117题填充每个节点的下一个右侧节点指针II

题目: 题解: func connect(root *Node) *Node {start : rootfor start ! nil {var nextStart, last *Nodehandle : func(cur *Node) {if cur nil {return}if nextStart nil {nextStart cur}if last ! nil {last.Next cur}last cur}for p : start; …

学至乎没而后止也

开场白 学至后没而后止也这个题目的原话来自与荀子《劝学》。大家知道什么意思吗?学习要学到你人没了,才算停止了。通俗点说就是只要没学死就往死里学,高雅点说就是要保持终身学习。 在以前说终身学习好像是一种良好习惯或品德,…

43-2 Linux入侵排查实验

环境准备: 老规则,我没有靶场就自己搭建了类似, 这里准备一台CentOS 7虚拟机作为受害者,然后使用CS制作木马并在受害者主机上线,具体过程可以看我之前写的一篇文章: 黑客必备利器:如何在系统上安装和使用 CobaltStrike(简称:CS)_cobalt strike-CSDN博客 最终的效果…