【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配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下…...
业务测试——历史数据
业务测试历史数据的必要性 1.保留上一版本的呈现效果以及数据正确性 2.做发版前后数据、样式一致性校验 3.后端处理历史数据,覆盖各类场景,保证客户的现有数据不会被影响,造成线上事务 4.为测试过程的覆盖度以及产品迭代的质量保驾护航 如何…...
【Linux】计算机网络套接字编写
文章目录 前言TCP协议和UDP协议网络字节序socket接口sockaddr结构1.创建套接字 cs2.绑定端口号 s3.监听socket s4.接受请求 s5.建立连接 c 地址转换函数字符串转in_addrin_addr转字符串 recvfrom和sendto 前言 上篇文章我们学习了计算机网络分层,了解了网络通信的本…...
Maven-学习笔记
文章目录 1. Maven简介2.Maven安装和基础配置3.Maven基本使用4.Maven坐标介绍 1. Maven简介 概念 Maven是专门用于管理和构建Java项目的工具 主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,…...
WebGL Shader着色器GLSL语言
在2D绘图中的坐标系统,默认情况下是与窗口坐标系统相同,它以canvas的左上角为坐标原点,沿X轴向右为正值,沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系,且每个方向都有可使用的值的…...
【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) ∑i11e18f(i)≡g(g<a)(moda) 那么 ∑ i 2 1 e 18 1 f ( i ) ≡ g 1 \sum_{i2}^{1e181}f(i)\equiv g1 ∑i21e181f…...
FFmpeg常见命令行(一):FFmpeg工具使用基础
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:FFmpe…...
Mock.js的基本使用方法
官网网址:Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时,后端接口还没有完成,那么前端怎么获取数据? 这时可以考虑前端搭建web server自己模拟假数据,这里我们选第三方库mockjs用来生成随机数据…...
TiDB 源码编译之 PD/TiDB Dashboard 篇
作者: ShawnYan 原文来源: https://tidb.net/blog/a16b1d46 TiDB TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融…...
Vue3描述列表(Descriptions)
😁 整体功能效果与 ant design vue 保持高度一致 😁 包含两种组件:Descriptions 和 DescriptionsItem(必须搭配使用!) 效果如下图:在线预览 APIs Descriptions 参数说明类型默认值必传title…...
【驱动开发day8作业】
作业1: 应用层代码 #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、 原因:前端参数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的文档,第一句话就说:Logs an error message to the Apple System Log facility.,所以首先,NSLog就不是设计作为普通的debug log的,而是error log;其次,NSLog也并非是printf的简单…...
全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在测试的过程中&a…...
Mysql自动同步的详细设置步骤
以下步骤是真实的测试过程,将其记录下来,与大家共同学习。 一、环境说明: 1、主数据库: (1)操作系统:安装在虚拟机中的CentOS Linux release 7.4.1708 (Core) [rootlocalhost ~]# cat /etc/redh…...
opencv-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…...
jenkins gitlab多分支构建发布
内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…...
刷题笔记 day8
1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1,求出最大元素全是1的子数组长度,看这道题第一感觉还要将里面的0变成1,感觉这道题解决起来很麻烦,但是我们可以转变思路,找出其最大子数组,使得子…...
C 语言的表达式
表达式 expression 表达式由运算符和运算对象组成。 最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。 一些表达式由子表达式(subexpression)组成。子表达式即较小的表达式。 这些都是一些表达式: -4 a…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
