当前位置: 首页 > news >正文

【C++】开源:事件驱动网络库libevent配置使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍事件驱动库libevent配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

项目Github地址:https://github.com/libevent/libevent

官网:https://libevent.org/

libevent是一个开源的事件通知库,它提供了一个跨平台的接口,用于处理事件驱动的编程。它允许开发人员编写高性能、可扩展的网络应用程序和服务器,而无需关注底层的网络细节。

以下是libevent库的一些主要特点和功能:

1.事件驱动:libevent使用事件驱动的方式处理网络和I/O操作。它基于回调机制,可以处理各种事件,包括网络连接、读写操作、定时器等。

2.跨平台支持:libevent可以在多个平台上运行,包括Linux、Unix、Windows等。它封装了不同操作系统的底层API,使开发人员能够在不同平台上实现相同的功能。

3.高性能:libevent被设计成高效的事件通知引擎,它使用了高效的I/O多路复用技术(如epoll、kqueue等),能够同时处理大量的并发连接和事件。

4.可扩展性:libevent提供了可扩展的接口和机制,开发人员可以自定义事件的处理方式,并添加自定义的事件类型。它还支持多线程和多进程编程模型,方便实现并发处理。

5.支持多种协议:libevent支持多种网络协议,包括TCP、UDP、SSL等。它提供了相应的API和功能,以便开发人员轻松地构建各种网络应用程序。

6.容易使用:libevent具有简洁的API和良好的文档,易于学习和使用。它提供了丰富的示例代码和教程,帮助开发人员快速上手。

总的来说,libevent是一个强大、灵活且高效的事件通知库,广泛用于开发网络应用程序、服务器和高性能系统。

😊2. 环境配置

下面进行环境配置:

# apt安装
sudo apt install libevent-dev
# 查看版本(ubuntu默认2.1.8-stable)
pkg-config --modversion libevent
# 源码安装
tar -zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable/
./configure
make
sudo make install

😆3. 使用说明

下面进行使用分析:

最简示例:

#include <event2/event.h>
#include <iostream>void eventCallback(evutil_socket_t fd, short events, void* arg) {std::cout << "Event occurred on socket: " << fd << std::endl;
}int main() {// 创建一个event_base对象,用于管理事件循环event_base* base = event_base_new();if (!base) {std::cerr << "Failed to create event base." << std::endl;return 1;}// 创建一个事件event* ev = event_new(base, -1, EV_PERSIST, eventCallback, nullptr);if (!ev) {std::cerr << "Failed to create event." << std::endl;event_base_free(base);return 1;}// 添加事件到事件循环timeval delay = { 2, 0 }; // 设定事件触发延迟时间为2秒event_add(ev, &delay);// 启动事件循环if (event_base_dispatch(base) == -1) {std::cerr << "Failed to dispatch event base." << std::endl;event_free(ev);event_base_free(base);return 1;}// 清理资源event_free(ev);event_base_free(base);return 0;
}

编译运行:

g++ -o main main.cpp -levent
./main

基于libevent的线程池示例:

#include <event2/event.h>
#include <event2/thread.h>
#include <iostream>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <thread>// 任务结构体
struct Task {std::function<void()> function;Task(const std::function<void()>& f) : function(f) {}
};// 线程池类
class ThreadPool {
public:ThreadPool(int numThreads) : stop(false) {// 初始化libevent线程支持evthread_use_pthreads();for (int i = 0; i < numThreads; ++i) {threads.emplace_back([this] {event_base* base = event_base_new();if (!base) {std::cerr << "Failed to create event base." << std::endl;return;}// 创建事件来触发任务执行event* ev = event_new(base, -1, EV_PERSIST, [](evutil_socket_t fd, short events, void* arg) {ThreadPool* threadPool = static_cast<ThreadPool*>(arg);threadPool->executeTask();}, this);timeval delay = { 0, 1000 }; // 每隔1毫秒触发一次事件event_add(ev, &delay);// 执行事件循环event_base_dispatch(base);event_free(ev);event_base_free(base);});}}~ThreadPool() {{std::unique_lock<std::mutex> lock(taskMutex);stop = true;}taskCondition.notify_all();for (auto& thread : threads) {thread.join();}}template<class F>void enqueue(F&& f) {{std::unique_lock<std::mutex> lock(taskMutex);tasks.emplace(new Task(std::forward<F>(f)));}taskCondition.notify_one();}private:std::vector<std::thread> threads;std::queue<Task*> tasks;std::mutex taskMutex;std::condition_variable taskCondition;bool stop;void executeTask() {Task* task = nullptr;{std::unique_lock<std::mutex> lock(taskMutex);if (tasks.empty()) {return;}task = tasks.front();tasks.pop();}task->function();delete task;}
};// 示例使用
void taskFunction(int id) {std::cout << "Task " << id << " is being executed." << std::endl;
}int main() {const int numThreads = 4;ThreadPool threadPool(numThreads);std::cout << "Create " << numThreads << " pools..." << std::endl;// 提交任务到线程池for (int i = 0; i < 10; ++i) {threadPool.enqueue([i] {taskFunction(i);});}// 等待所有任务完成std::this_thread::sleep_for(std::chrono::seconds(3));std::cout << "Task end!!!" << std::endl;return 0;
}

编译运行:

g++ -o main main.cpp -levent -lpthread -levent_pthreads

在这里插入图片描述

以上。

相关文章:

【C++】开源:事件驱动网络库libevent配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…...

业务测试——历史数据

业务测试历史数据的必要性 1.保留上一版本的呈现效果以及数据正确性 2.做发版前后数据、样式一致性校验 3.后端处理历史数据&#xff0c;覆盖各类场景&#xff0c;保证客户的现有数据不会被影响&#xff0c;造成线上事务 4.为测试过程的覆盖度以及产品迭代的质量保驾护航 如何…...

【Linux】计算机网络套接字编写

文章目录 前言TCP协议和UDP协议网络字节序socket接口sockaddr结构1.创建套接字 cs2.绑定端口号 s3.监听socket s4.接受请求 s5.建立连接 c 地址转换函数字符串转in_addrin_addr转字符串 recvfrom和sendto 前言 上篇文章我们学习了计算机网络分层&#xff0c;了解了网络通信的本…...

Maven-学习笔记

文章目录 1. Maven简介2.Maven安装和基础配置3.Maven基本使用4.Maven坐标介绍 1. Maven简介 概念 Maven是专门用于管理和构建Java项目的工具 主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;…...

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统&#xff0c;默认情况下是与窗口坐标系统相同&#xff0c;它以canvas的左上角为坐标原点&#xff0c;沿X轴向右为正值&#xff0c;沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系&#xff0c;且每个方向都有可使用的值的…...

【Codeforces】 CF468C Hack it!

题目链接 CF方向 Luogu方向 题目解法 令 ∑ i 1 1 e 18 f ( i ) ≡ g ( g < a ) ( m o d a ) \sum_{i1}^{1e18}f(i)\equiv g(g<a)(mod \;a) ∑i11e18​f(i)≡g(g<a)(moda) 那么 ∑ i 2 1 e 18 1 f ( i ) ≡ g 1 \sum_{i2}^{1e181}f(i)\equiv g1 ∑i21e181​f…...

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…...

Mock.js的基本使用方法

官网网址&#xff1a;Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时&#xff0c;后端接口还没有完成&#xff0c;那么前端怎么获取数据&#xff1f; 这时可以考虑前端搭建web server自己模拟假数据&#xff0c;这里我们选第三方库mockjs用来生成随机数据&#xf…...

TiDB 源码编译之 PD/TiDB Dashboard 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/a16b1d46 TiDB TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融…...

Vue3描述列表(Descriptions)

&#x1f601; 整体功能效果与 ant design vue 保持高度一致 &#x1f601; 包含两种组件&#xff1a;Descriptions 和 DescriptionsItem&#xff08;必须搭配使用&#xff01;&#xff09; 效果如下图&#xff1a;在线预览 APIs Descriptions 参数说明类型默认值必传title…...

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…...

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…...

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …...

OSLog与NSLog对比

NSLog: NSLog的文档&#xff0c;第一句话就说&#xff1a;Logs an error message to the Apple System Log facility.&#xff0c;所以首先&#xff0c;NSLog就不是设计作为普通的debug log的&#xff0c;而是error log&#xff1b;其次&#xff0c;NSLog也并非是printf的简单…...

全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在测试的过程中&a…...

Mysql自动同步的详细设置步骤

以下步骤是真实的测试过程&#xff0c;将其记录下来&#xff0c;与大家共同学习。 一、环境说明&#xff1a; 1、主数据库&#xff1a; &#xff08;1&#xff09;操作系统&#xff1a;安装在虚拟机中的CentOS Linux release 7.4.1708 (Core) [rootlocalhost ~]# cat /etc/redh…...

opencv-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算&#xff0c;它有助于关闭前景物体内部的小孔&#xff0c;或去除物体上的小黑点&#xff0c;还可以将不同的前景图像进行连接。 例如&#xff0c;在图 8-17 中&#xff0c;通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔&#xff08;内部闭合的…...

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…...

刷题笔记 day8

1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1&#xff0c;求出最大元素全是1的子数组长度&#xff0c;看这道题第一感觉还要将里面的0变成1&#xff0c;感觉这道题解决起来很麻烦&#xff0c;但是我们可以转变思路&#xff0c;找出其最大子数组&#xff0c;使得子…...

C 语言的表达式

表达式 expression 表达式由运算符和运算对象组成。 最简单的表达式是一个单独的运算对象&#xff0c;以此为基础可以建立复杂的表达式。 一些表达式由子表达式&#xff08;subexpression&#xff09;组成。子表达式即较小的表达式。 这些都是一些表达式&#xff1a; -4 a…...

AI工作流编排框架aiflows:构建模块化、可维护的多智能体系统

1. 项目概述&#xff1a;当AI工作流成为团队协作的“操作系统”如果你和我一样&#xff0c;在过去几年里尝试过将多个大语言模型&#xff08;LLM&#xff09;串联起来&#xff0c;构建一个能处理复杂任务的智能体&#xff08;Agent&#xff09;或工作流&#xff0c;那你一定经历…...

QMCDecode:轻松解锁QQ音乐加密音频的Mac专属神器

QMCDecode&#xff1a;轻松解锁QQ音乐加密音频的Mac专属神器 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结…...

告别系统默认驱动:手把手教你为沁恒CH38x/CH35x PCIe串口卡加载官方Linux驱动(含常见错误排查)

告别系统默认驱动&#xff1a;手把手教你为沁恒CH38x/CH35x PCIe串口卡加载官方Linux驱动&#xff08;含常见错误排查&#xff09; 在嵌入式开发和工业控制领域&#xff0c;串口通信的稳定性和功能完整性往往直接影响整个系统的可靠性。当使用沁恒CH38x/CH35x系列PCIe串口卡时…...

Shermie-proxy:基于Node.js的脚本化HTTP/HTTPS代理调试工具实战指南

1. 项目概述与核心价值最近在折腾一些本地开发环境下的网络请求调试和抓包&#xff0c;发现一个挺有意思的开源项目kxg3030/shermie-proxy。这本质上是一个基于 Node.js 实现的 HTTP/HTTPS 代理服务器&#xff0c;但它的定位非常清晰&#xff1a;专为开发者本地调试和网络请求分…...

GIT 切换分支合并分支前一定要先 fetch,一定要选择远程分支进行操作

测试 GIT 切换分支 合并分支 1、切换和合并分支时&#xff0c;要选择远程的分支&#xff0c;确保本地的代码是最新的 2、切换分支前不 fetch3、切换分支前先点 fetch4、合并分支前不 fetch5、合并分支前先 fetch...

百度网盘SVIP破解插件:macOS用户突破下载限速的终极指南

百度网盘SVIP破解插件&#xff1a;macOS用户突破下载限速的终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘SVIP破解插件&#xff08;…...

MASA模组全家桶汉化包:3329条专业翻译,彻底告别英文界面困扰

MASA模组全家桶汉化包&#xff1a;3329条专业翻译&#xff0c;彻底告别英文界面困扰 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Minecraft技术模组的英文界面而头疼吗&#x…...

如何用Fillinger脚本彻底告别Illustrator重复劳动:设计师的智能填充革命

如何用Fillinger脚本彻底告别Illustrator重复劳动&#xff1a;设计师的智能填充革命 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是不是也厌倦了在Illustrator中一遍遍复制粘贴…...

Kubernetes轻量级服务网格Cetus:核心流量治理与Sidecar代理实践

1. 项目概述&#xff1a;一个为Kubernetes而生的智能代理如果你正在管理一个规模不小的Kubernetes集群&#xff0c;并且对服务网格&#xff08;Service Mesh&#xff09;的复杂性望而却步&#xff0c;或者觉得像Istio这样的“巨无霸”方案有些杀鸡用牛刀&#xff0c;那么你很可…...

Visual C++运行库终极指南:如何3分钟解决Windows软件启动失败问题

Visual C运行库终极指南&#xff1a;如何3分钟解决Windows软件启动失败问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的场景&#xf…...