网络库-libevent介绍

2024-05-14 05:36
文章标签 介绍 网络 libevent

本文主要是介绍网络库-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介绍

这篇关于网络库-libevent介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987883

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数