网络库-libevent介绍

news2024/11/26 22:37:45

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.coloradmin.cn/o/1671323.html

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

相关文章

Office之Word应用(二)

一、页眉添加文件名称和页码 1、双击页眉&#xff0c;点击“页眉-空白&#xff08;三栏&#xff09;” 2、删掉第一处&#xff08;鼠标放在上面就会选中&#xff0c;Enter即可&#xff09;&#xff0c;第二处输入文档名称&#xff0c;第三处插入页码。 注&#xff1a;插入页码时…

【CSP CCF记录】202203-2 出行计划

题目 过程 第一次提交 暴力求解&#xff0c;时间复杂度为n*n&#xff0c;超时 #include<bits/stdc.h> using namespace std; const int N100001; int n,m,k; int t[N],c[N],q[N]; int main() {cin>>n>>m>>k;for(int i0;i<n;i){cin>>t[i]&g…

计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目主要包括&#xff1a;物体表面缺陷检测技术项目介绍&#xff0c;数据构造&#xff0c;模型介绍。 物体表面缺陷检测技术是工业自动化…

深入探讨黑盒测试:等价类划分与边界值分析

文章目录 概要黑盒测试等价类划分边界值分析 设计测试用例小结 概要 在软件开发领域&#xff0c;测试是确保产品质量的关键步骤之一。而黑盒测试方法作为其中的一种&#xff0c;通过关注输入与输出之间的关系&#xff0c;而不考虑内部实现的细节&#xff0c;被广泛应用于各种软…

最短木板长度 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 小明有 n 块木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 块木板长…

3分钟,学会一个 Lambda 小知识之【流API】

之前给大家介绍的 Lambda 小知识还记得吗&#xff1f;今天再来给大家介绍&#xff0c; 流API 的相关知识要点。 流API Stream是Java8中处理集合的关键抽象概念&#xff0c;它可以指定你对集合的&#xff0c;可以执行查找、过滤和映射等数据操作。 Stream 使用一种类似用 SQ…

SSRF(服务器端请求伪造)的学习以及相关例题(上)

目录 一、SSRF的介绍 二、漏洞产生的原因 三、利用SSRF可以实现的效果&#xff08;攻击方式&#xff09; 四、SSRF的利用 五、SSRF中的函数 file_get_content() 、fsockopen() 、curl_exec() 1.file_get_content()&#xff1a; 2.fsockopen(): 3.curl_exec()&#xff1…

Golang面向对象编程(二)

文章目录 封装基本介绍封装的实现工厂函数 继承基本介绍继承的实现字段和方法访问细节多继承 封装 基本介绍 基本介绍 封装&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一种重要概念&#xff0c;封装通过将数据和相关的方法组合在一起…

进程间的IPC通信机制

一、介绍 进程与进程间的用户空间相互独立&#xff0c;内核空间共享。 1.传统的进程间通信机制 a.无名管道 pipe b.有名管道 fifo c.信号 signal 2.system V中的IPC对象 a.消息队列 message queue b.共享内存 shared memory c.信号灯集 semaphoare 3.可用于跨主机传输…

【C++ 】红黑树

1.1 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff…

Android的NDK开发中Cmake报缺少对应的x86的so文件

需要实现一个串口操作的命令。 供应商提供了2个so文件。 分别是 armeabi-v7a 和 arm64-v8a 添加到对应的cpp下。 在CMakeLists.txt里添加so文件 # 添加预编译的库 add_library(libxxx SHARED IMPORTED)# 设置库的路径 set_target_properties(libxxx PROPERTIES IMPORTED_…

OPT系列极速版远距离光数据传输器|光通讯传感器安装与调试方法

OPT系列极速版远距离光数据传输器|光通讯传感器使用红外激光通信&#xff0c;满足全双工 100M 带宽&#xff0c;通讯距离可达 300 米。能够快速&#xff0c;稳地传送数据&#xff0c;支持主流的工业控制总线&#xff08;Profinet&#xff0c;Ethercat 等&#xff09;&#xff1…

如何8步完成hadoop单机安装

前言 Hadoop是一个开源框架&#xff0c;用于存储和处理大规模数据集。 系统要求 Ubuntu 20.044GB&#xff08;建议8GB&#xff09;hadoop-3.3.6 步骤1&#xff1a;更新系统 打开终端并输入以下命令来更新您的系统&#xff1a; apt update 步骤2&#xff1a;安装Java Had…

浪潮信息企业级存储逆势增长 市场份额位列中国前二

2023年&#xff0c;中国企业级存储市场竞争激烈&#xff0c;在挑战重重之下&#xff0c;浪潮信息仍然实现逆势增长&#xff0c;销售额增幅达4.7%&#xff0c;市场份额相比2022年扩大0.6%&#xff0c;位列中国前二。另外&#xff0c;在高端和全闪存阵列细分市场&#xff0c;浪潮…

文件操作IO网络编程网络原理

​ 文件操作—IO 文件在计算机中可以代表很多东西 在操作系统中, 文件主要是指硬盘文件 硬盘主要分为机械硬盘和固态硬盘。机械硬盘通过磁头在旋转的磁盘上读取数据&#xff0c;适合顺序读取。而固态硬盘则使用闪存芯片来存储数据&#xff0c;没有机械部件&#xff0c;因此读…

进程创建-fork

demo1代码状态变迁 demo2代码输出到stdout使用管道 demo1 代码 #include <pthread.h> #include <iostream> #include <unistd.h> int main(int argc, char const *argv[]) {// 1.pid_t x fork();// 2.pid_t y fork();// 3.printf("%d %d\n", x…

电机及FOC算法介绍

一.电机概述 1.电机的简介 电机是一种可以在电能和机械能的之间相互转换的设备&#xff0c;其中发电机是将机械能转换为电能&#xff0c;电动机是将电能转换为机械能。发电机的主要用于产生电能&#xff0c;用途单一&#xff0c;但是电动机主要用于产生机械能&#xff0c;用途…

内容与图像一对多问题解决

场景复现 分析&#xff1a; 其实这是两给表&#xff0c;一个内容表&#xff0c;一个图片表&#xff0c;一对多的关系。 解决思路: 1. 先上传图片拿到图片的List集合ids&#xff0c;返回值是集合的ids&#xff0c;给到前端 2. 再添加内容表的数据生成了id&#xff0c;遍历查…

【Python探索之旅】初识Python

目录 发展史&#xff1a; 环境安装&#xff1a; 入门案例&#xff1a; 变量类型 标准数据类型 数字类型&#xff1a; 字符串&#xff1a; 全篇总结&#xff1a; 前言&#xff1a; Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设…

提升网络性能,解决网络故障,了解AnaTraf网络流量分析仪

在当今数字化时代&#xff0c;网络性能监测与诊断(Network Performance Monitoring and Diagnosis,NPMD)成为了企业和个人关注的焦点。随着网络流量不断增长&#xff0c;确保网络的稳定性和高效性变得更加重要。在这个领域&#xff0c;AnaTraf网络流量分析仪是您不可或缺的得力…