网络库-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.mzph.cn/pingmian/11481.shtml

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

相关文章

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!

工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧&#xff01; Web安全类 Web类工具主要是通过各种扫描工具&#xff0c;发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限&#xff0c;常用的…

iZotope RX 11 for Mac:音频修复的终极利器

在音频制作的浩瀚星海中&#xff0c;每一份声音都是珍贵的宝石&#xff0c;但往往被各种噪音、杂音所掩盖。此刻&#xff0c;iZotope RX 11 for Mac犹如一位专业的匠人&#xff0c;以其精湛的技术&#xff0c;将每一份声音雕琢至完美。 iZotope RX 11 for Mac&#xff0c;这是…

创新点!CNN与LSTM结合,实现更准预测、更快效率、更高性能!

推荐一个能发表高质量论文的好方向&#xff1a;LSTM结合CNN。 LSTM擅长捕捉序列数据中的长期依赖关系&#xff0c;而CNN则擅长提取图像数据的局部特征。通过结合两者的优势&#xff0c;我们可以让模型同时考虑到数据的时序信息和空间信息&#xff0c;减少参数降低过拟合风险&a…

MySQL—子查询

目录 ▐ 子查询概述 ▐ 准备工作 ▐ 标量子查询 ▐ 列子查询 ▐ 表子查询 ▐ 多信息嵌套 ▐ 子查询概述 • 子查询也称嵌套查询&#xff0c;即在一个查询语句中又出现了查询语句 • 子查询可以出现在from 后面 或where后面 • 出现在 from 后称表子查询&#xff0c;结…

远程终端协议TELNET

一、概述 TELNET是一个简单的远程终端协议&#xff0c;是互联网正式标准。 实现在本地对远程计算机进行操作&#xff1b;在本地键盘输入的字符通过应用层TELNET协议传输到远程服务器上&#xff0c;同时远程服务器把字符传送过来显示在本地的显示器上&#xff1b;TELNET协议采…

智能制造装备业项目数字化管理之项目模板管理

智能制造装备&#xff0c;作为工业4.0的核心组成部分&#xff0c;正日益受到全球制造业的关注。这类装备融合了信息技术和制造技术&#xff0c;旨在提高生产效率、降低成本并增强产品的个性化。然而&#xff0c;随着智能制造装备行业的飞速发展&#xff0c;项目管理复杂性也在不…

软件文档-总体测试计划书(Word原件2024)

软件资料清单列表部分文档&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解决…

Spring事件分析以及多种使用方式实践 使用场景 附可执行demo

我们先说说它的特点&#xff0c;优缺点&#xff0c;以及使用场景&#xff0c;然后再说具体是怎么做的 Spring事件驱动的优点 松耦合 事件驱动模型通过发布-订阅机制促进组件间的解耦&#xff0c;发送者和接收者不需要直接知道对方的存在&#xff0c;只需关注事件本身&#xff…

【机器学习-06】Scikit-Learn机器学习工具包进阶指南:机器学习分类模型实战与数据可视化分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

[猫头虎分享21天微信小程序基础入门教程]第7天:小程序的权限与API使用

第7天&#xff1a;小程序的权限与API使用 &#x1f510; 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们将继续微信小程序的学习&#xff0c;重点了解如何使用微信小程序的API&#xff0c;以及如何管理和请求小程序的权限。通过这些知识&am…

可视化:智慧能源解决方案,降本增效,运筹帷幄。

智慧能源可视化解决方案是一种利用先进的技术和工具&#xff0c;将能源数据以直观、可视的方式呈现出来&#xff0c;帮助企业更好地管理能源使用&#xff0c;降低成本&#xff0c;提高效率的解决方案。 以下是一些智慧能源可视化解决方案可以帮助企业降本增效、智连未来的方式&…

js前端获取农历日期

对于公历来说&#xff0c;直接 new 一个 Date 就能获取到&#xff0c;而对于农历来讲可就很难了&#xff0c;因为农历需要有许多复杂计算&#xff0c;虽然一般用的甚少&#xff0c;但对于某些场景来说还是会需要的&#xff0c;那么怎样获取农历日期呢&#xff1f; 这里推荐一个…

Linux:进程信号

生活角度的信号 a.信号在生活中&#xff0c;随时可以产生(信号的产生和我是异步的) b.你能认识这个信号 c.我们知道信号产生了&#xff0c;我能识别这个信号&#xff0c;信号该怎么处理 d.我们可能正在做着更重要的事情&#xff0c;把到来的信号暂不处理(1.我记得这个事 2.…

要不还是别搞Google Play了

​好消息&#xff1a;误导性条款合规了 坏消息: 应用被暂停了&#xff0c;太难玩了 5.13日收到邮件&#xff0c;被告知应用因为应用内体验问题被暂停上架了 邮件大意是由于违反执行流程政策(Violation of Enforcement Process policy)。 这个政策主要是讲Google Play会对账户/…

求四个整数中的最大值(函数)(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a, b, c, d, max;//获取用户输入的数据&#xff1b;printf("请输入4个整数&#x…

你知道在 TS 中判断两个类型相等有多难吗?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ TypeScript 中的类型相等 如果我们想判断两个变量是否相等&#xff0c;可以简单的通过 或 来进行比较&#xff0c;但是对比两个类型则不行。 在 TypeScript 中&#xff0c;类型是静态的&#xff0c;只会在编译时…

【Esp32S3 | Arduino】在Arduino中使用C++的高级特性

文章目录 前言一、Arduino中的Vector示例代码二、Arduino中的Map示例代码前言 最近在玩Arduino,自上次发现Arduino可以用Template,能使用高级宏后,这次发现Arduino竟可以使用C++中的一些STL容器,这属实令人震惊。起因是我打算做一个动态的数组,但是手动实现一些操作属实麻烦…

Hack The Box-SolarLab

总体思路 SMB获取敏感信息->CVE-2023-33733漏洞注入->CVE-2023-32315->敏感信息泄露 信息收集&端口利用 nmap -sSVC -p1-10000 10.10.11.16发现目标开放了80、135、139、445和6791端口&#xff0c;并且对应的端口也给出了重定向的标志&#xff0c;将域名加入到…

实验过程演示【计算机网络实验】

前言 这是陈旧已久的草稿2023-05-20 11:23:54 这个是计算机网络的一个实验&#xff0c;现在也不知道这个是啥来着。 现在2024-5-12 22:33:17&#xff0c;发布到[计算机网络实验]专栏中。 实验过程演示 2023-5-18 20:17:45 1&#xff0e;搭建一个多跳网络拓扑&#xff0c;…

算法题解记录25+++验证二叉搜索树(百日筑基)

题目描述&#xff1a; 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必…