网络库-libevent介绍

1.简介

libevent是一个事件驱动的网络库,主要用于构建可扩展的网络服务器。它提供了跨平台的API,支持多种事件通知机制,如select、poll、epoll、kqueue等。

主要组件

  • event: 表示一个具体的事件,包括事件类型、事件回调等。
  • event_base: 用于管理所有的事件,负责事件的添加、删除和分发。
  • buffer: 提供缓冲区操作,用于网络数据的读写。
  • evbuffer: 提供增强的缓冲区操作,支持链式缓冲区。
  • bufferevent: 基于buffer和evbuffer的更高层次的抽象,用于简化网络数据的读写。

2.工作原理

libevent的工作原理基于事件驱动模型。

事件循环(Event Loop)
libevent的核心是一个事件循环,它不断地检查是否有事件发生,并在事件发生时调用相应的回调函数。这个循环是由event_base_dispatch()函数启动的,它会一直运行直到被明确地要求退出。

事件(Events)
在libevent中,事件可以是多种类型,包括:

  • I/O事件:文件描述符变得可读、可写或发生异常。
  • 定时器事件:在指定的时间间隔后触发。
  • 信号事件:当特定的信号发生时触发。
  • 持续事件:定期触发,用于执行周期性的任务。

事件驱动模型(Event-Driven Model)
libevent使用事件驱动模型来管理事件。它将事件与回调函数关联起来,当事件发生时,libevent会调用相应的回调函数来处理事件。

事件处理器(Event Handler)

事件处理器是libevent中用于管理事件的内部结构。它包含了事件的信息,如文件描述符、事件类型、回调函数和用户数据。libevent提供了event和bufferevent两种主要的事件处理器:

  • event:用于处理基本的I/O事件、定时器和信号。
  • bufferevent:提供了更高层次的抽象,用于处理带缓冲的I/O操作,简化了读写操作。

3.常用接口介绍

event_base 相关接口:

  • struct event_base *event_base_new(void);
    创建一个新的event_base结构,这是使用libevent的第一步。

  • int event_base_dispatch(struct event_base *base);
    开始event_base的事件循环,这个函数会一直运行,直到没有活动的事件或者调用了event_base_loopbreak()或event_base_loopexit()。

  • void event_base_free(struct event_base *base);
    释放event_base结构及其所有关联的资源。

  • int event_base_set(struct event_base *base, struct event *ev);
    设置event使用的event_base。

event 相关接口:

  • struct event *event_new(struct event_base *base, evutil_socket_t fd,
    short events,event_callback_fn callback, void *callback_arg);
    创建一个新的event,指定事件base、文件描述符、事件类型、回调函数和用户数据。

  • int event_add(struct event*ev, const struct timeval *tv);
    将event添加到其event_base中,可以指定一个timeval结构来设置事件的超时时间。

  • int event_del(structevent *ev);
    从event_base中删除一个event。

  • void event_free(struct event *ev);
    释放event结构及其所有关联的资源。

bufferevent 相关接口:

  • struct bufferevent *bufferevent_socket_new(struct event_base *base,
    evutil_socket_t fd, int options);
    创建一个新的bufferevent,它封装了socket操作,可以用于读写网络数据。

  • int bufferevent_setcb(struct bufferevent *bev, bufferevent_data_cb
    readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb,
    void *cbarg);
    设置bufferevent的回调函数,包括读回调、写回调和事件回调。

  • int bufferevent_enable(struct bufferevent *bev, short event);
    启用bufferevent的特定事件,如读事件、写事件。

  • int bufferevent_disable(struct bufferevent *bev, short event);
    禁用bufferevent的特定事件。

  • int bufferevent_free(struct bufferevent *bev);
    释放bufferevent及其所有关联的资源。

HTTP服务器相关接口:

  • struct evhttp *evhttp_new(struct event_base *base);
    创建一个新的HTTP服务器。

  • void evhttp_set_gencb(struct evhttp *http, void (*cb)(struct evhttp_request *, void *), void *arg);
    设置HTTP服务器的通用请求回调函数。

  • struct evhttp_bound_socket *evhttp_bind_socket_with_handle(struct
    evhttp *http, const char *address, ev_uint16_t port);
    将HTTP服务器绑定到指定的地址和端口。

  • void evhttp_free(struct evhttp *http);
    释放HTTP服务器及其所有关联的资源。

4.环境搭建

下载地址:https://github.com/libevent/libevent
在这里插入图片描述
下载完成,进行解压,然后使用cmake编译。
在这里插入图片描述
生成库如下图所示:
在这里插入图片描述
拷贝如下文件和lib文件到我们的demo工程中。
源码目录的下的include目录和编译后的include目录,以及lib、dll库。
在这里插入图片描述
配置visual studio环境,请看Jsoncpp介绍。如何配置include、lib目录。

5.示例

下面是一个简单的libevent服务器示例,监听TCP连接,接收客户端数据并回显。

#include <stdio.h>
#include <string.h>
#include <event.h>
#include <evhttp.h>void request_handler(struct evhttp_request *req, void *arg) 
{struct evbuffer *buf;const char *uri = evhttp_request_get_uri(req);printf("Received a request: %s\n", uri);buf = evbuffer_new();evbuffer_add_printf(buf, "Hello, World! Your request uri is: %s", uri);evhttp_send_reply(req, HTTP_OK, "OK", buf);evbuffer_free(buf);
}int main()
{struct event_base *base;struct evhttp *http;struct evhttp_bound_socket *handle;base = event_base_new();if (!base) {fprintf(stderr, "Failed to create event base\n");return 1;}http = evhttp_new(base);if (!http) {fprintf(stderr, "Failed to create evhttp\n");return 1;}evhttp_set_gencb(http, request_handler, NULL);handle = evhttp_bind_socket_with_handle(http, "127.0.0.1", 8080);if (!handle) {fprintf(stderr, "Failed to bind socket\n");return 1;}printf("Listening on 8080\n");event_base_dispatch(base);evhttp_free(http);event_base_free(base);return 0;
}

6.更多参考

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

压缩和归档库-LZ4介绍

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

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

相关文章

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…

如何查看centos7是否安装nginx

要查看 CentOS 7 系统上是否安装了 Nginx&#xff0c;您可以使用多种方法来检查。以下是一些常见的方法&#xff1a; 通过 RPM 包管理器查询 在 CentOS 系统上&#xff0c;可以使用 RPM 包管理器来查询已安装的软件包。要查看是否安装了 Nginx&#xff0c;您可以在终端中运行以…

【C++】学习笔记——继承_1

文章目录 十一、模板进阶5. 模板的优缺点 十二、继承1. 继承的概念及定义2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数 未完待续 十一、模板进阶 5. 模板的优缺点 优点&#xff1a; 模板复用了代码&#xff0c;节省资源&#xff0c;更快的迭代开发&a…

某银行软件测试笔试题,满分一百你能得多少分?

时间90分钟&#xff0c;满分100分&#xff09; 考试要求&#xff1a;计算机相关专业试题 一、填空题&#xff08;每空1分&#xff0c;共10分&#xff09; 1. ______验证___是保证软件正确实现特定功能的一系列活动和过程。 2. 按开发阶段分&#xff0c;软件测试可分为&#x…

SSIM(Structural Similarity),结构相似性及MATLAB实现

参考文献 Wang, Zhou; Bovik, A.C.; Sheikh, H.R.; Simoncelli, E.P. (2004-04-01). “Image quality assessment: from error visibility to structural similarity”. IEEE Transactions on Image Processing. 13 (4): 600–612. Bibcode:2004ITIP…13…600W. CiteSeerX 10.…

YOLO数据集制作(二)|json文件转txt验证

以下教程用于验证转成YOLO使用的txt格式&#xff0c;适用场景&#xff1a;矩形框&#xff0c;配合json格式文件转成YOLO使用的txt格式脚本使用。 https://blog.csdn.net/StopAndGoyyy/article/details/138681454 使用方式&#xff1a;将img_path和label_path分别填入对应的图…

Android Studio开发之路(九)创建android library以及生成aar文件

一、需求 我做了一个camerax相机opencv图像处理图片上传服务器功能的android应用&#xff0c;应客户需求要将其改成一个SDK&#xff0c;由客户加到他们自己的app里边。 于是&#xff0c;我需要制作一个library&#xff0c;打包成aar文件&#xff08;jar:只有代码&#xff0c;没…

YOLOv5改进 | 注意力机制 | 用于移动端的高效坐标CA注意力机制

在深度学习目标检测领域&#xff0c;YOLOv5成为了备受关注的模型之一。本文给大家带来的是能用于移动端的高效坐标CA注意力机制。文章在介绍主要的原理后&#xff0c;将手把手教学如何进行模块的代码添加和修改&#xff0c;并将修改后的完整代码放在文章的最后&#xff0c;方便…

打破地域界限,HubSpot海外获客系统引领企业走向国际化

在全球化的浪潮中&#xff0c;企业如何精准把握海外市场、高效获取并转化目标客户&#xff0c;已成为决定其市场地位与未来发展的关键因素。HubSpot海外获客系统以其独特的视角、强大的功能和卓越的性能&#xff0c;正在引领全球营销进入一个新的时代。今天运营坛将深入剖析Hub…

交易复盘-20240513

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 双成药业 (1)|[9:30]|[3566万]|0.34 中通客车 (1)|[9:43]|[7678万]|0.15 嘉华股份 (2)|[9:30]|[36…

基于Springboot的大学生平时成绩量化管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的大学生平时成绩量化管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…

Spring Boot日志

目录 一、日志概述 1、为什么要学习日志&#xff1f; 2、日志的用途 &#xff08;1&#xff09;系统监控 &#xff08;2&#xff09;数据采集 &#xff08;3&#xff09;日志审计 二、日志使用 1、打印日志 &#xff08;1&#xff09;在程序中得到日志对象 &#xf…

WebView基础知识以及Androidx-WebKit的使用

文章目录 摘要WebView基础一、启动调整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、启动安全浏览服务二、设置代理三、安全的 WebView 和 Native 通信支持四、文件传递五、深色主题的支持六、JavaScript and WebAssem…

自主实现Telnet流量抓取

自主实现Telnet流量抓取 根据测试需求&#xff0c;需要抓取Telnet流量包&#xff0c;使用wireshark Python&#xff08;socket、telnetlib库&#xff09;实现 实现代码 主要此处有坑&#xff0c; 根据协议规则&#xff0c;wireshark 默认端口为23 的是Telnet协议&#xff0…

3D模型实时变形算法

最近&#xff0c;在尝试渲染一些奇怪的形状后&#xff0c;我陷入了计算机图形学的困境。事实证明&#xff0c;对于我试图解决的具体问题&#xff0c;没有现有的选项完全适合我想要做的事情。几周后&#xff0c;我终于带着一些答案再次浮出水面&#xff0c;写了很多行代码&#…

DS:顺序表、单链表的相关OJ题训练(2)

欢迎各位来到 Harper.Lee 的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 一、力扣--141. 环形链表 题目描述&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果链表中有某个…

HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架

网页基本信息 DOCTYPE是设置使用什么规范&#xff0c;网页整个信息都在html标签中&#xff0c;head标签里包含字符集设置&#xff0c;网页介绍等信息&#xff0c;title标签是网页的名称&#xff0c;网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09; https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

软件需求工程复习——知识点

一&#xff0c;单选题&#xff08;20分&#xff09; 二&#xff0c;判断题&#xff08;10分&#xff09; 三&#xff0c;简答题&#xff08;20分&#xff09; 四&#xff0c;分析与设计题&#xff08;50分&#xff09; 一、导论 1、应用型软件的模拟特性 应用型软件在“模拟”…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…