Libevent3——bufferevent的特性、其事件对象的创建和销毁、给事件对象设置回调、缓冲区开启和关闭、并⭐网络通信开个头(转载)

本文主要是介绍Libevent3——bufferevent的特性、其事件对象的创建和销毁、给事件对象设置回调、缓冲区开启和关闭、并⭐网络通信开个头(转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bufferevent的特性:
bufferevent是带有buf的事件:
头文件#include<event2/bufferevent.h>
原理:bufferevent有两个缓冲区,用队列实现,先进先出
读:有数据—> 读的回调函数被调用 —> 使用bufferevent_read() —>读数据
写:使用bufferevent_write() —> 向缓冲区中写数 —> 该缓冲区有数据自动写出 —> 写完,回调函数被调用

带缓冲区的事件创建、销毁
创建: struct bufferevent bufferevent_socket_new(struct event_base base, evutil_socket_t fd, enum bufferevent_options options);
1,base;
2,fd封装到bufferevent内的fd;
3,options:基本就用BEV_OPT_CLOSE_ON_FREE,表示释放bufferevent时关闭底层传输端口,即关闭底层套接字,释放底层bufferevent等
返回:成功创建bufferevent事件对象

销毁void bufferevent_socket_free(struct bufferevent *ev);

给bufferevent事件对象设置回调
对比event:
event_new(fd, callback);------->创建ev中自带cb,event_add再挂到event_base上即可
bufferevent_socket_new(fd) 没有cb所以需要再一个函数用于来专门设置回调bufferevent_setcb(callback)
因为有两个缓冲区,所以要设置读写回调函数,并加一个事件回调函数

void bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb readcb,
bufferevent_data_cb writecb,
bufferevent_event_cb eventcb,
void *cbarg);

bufev:缓冲区事件
readcb:设置bufferevent读缓冲,对应回调read_cb{bufferevent_read() 读数据 }
writecb:设置bufferevent写缓冲,对应回调write_cb{ }—给调用者发送写成功通知,可以NULL
eventcb:设置事件回调。也可传NULL

回调函数类型:typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);

read回调函数:

void read_cb(struct bufferevent *bev, void *cbarg)
{

bufferevent_read();
}

其中bufferevent_read()函数的原型:size_t bufferevent_read(struct bufferevent *bev, void buf, size_t bufsize);

写回调函数其实意义不大,因为它就是在写完之后再发送一个写完的信号而已,我们只需要一个代替write的写函数即可int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);

禁用和启用缓冲区
默认: 新建的bufferevent写缓冲是enable,而读缓冲是disable的
1,void bufferevent_enable(struct bufferevent *bufev, short events);启用缓冲区
2,void bufferevent_disable(struct bufferevent * bufev, short events);禁用
3,short bufferevent_get_enabled(struct bufferevent *bufev);获取缓冲区的禁用状态,需要借助&来得到
其中第二个参数events可以取EV_READ、EV_WRITE、EV_READ|EV_WRITE

bufferevent的网络通信知识前提:

客户端和服务器连接和监听⭐
客户端:
socket(); connect() ----->
int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *address, int addrlen);
参数1; bev = bufferevent 事件对象(封装了fd)
参数2/3的 address、len等同于connect()的参数2/3

服务器:
socket(); bind(); listen(); accept(); ----->
evconnlistener_new_bind()这个函数可以完成系统调用socket(); bind(); listen(); accept();四个函数的作用

#include<event2/listener.h>

//服务器创建监听器
struct evconnlistener *evconnlistener_new_bind(
struct event_base *base,
evconnlistener_cb cb,//监听回调函数,接收连接之后,用户要做的操作
void *ptr,//回调函数的参数
unsigned flags,//可以识别的标志
int backlog,//时listen()函数的第二个参数,即同时连接的最大数,传-1就表示使用默认的最大值128
const struct sockaddr *sa,//服务器+Port,是一个传入函数,是服务器自己的地址结构
int socklen//sa的大小
);

flags可取值:
LEV_OPT_CLOSE_ON_FREE 释放bufferevent时关闭底层传输端口,这将关闭底层套接字,释放底层bufferevent等
LEV_OPT_REUSEABLE 端口复用,可以“|”

返回值:struct evconnlistener *listener成功创建的监听器

回调函数,一旦被回调,说明在其内部应该与客户端完成数据读写操作进行通信
回调函数类型👇:【注意】该回调函数不是由我们调用的,是框架自动调用

typedef void (*evconnlistener_cb)(
struct evconnlistener *listener,//上面监听器evconnlistener_new_bind函数的返回值
evutil_socket sock,//用于通信的文件描述符
struct sockaddr *addr,//客户端IP+端口
int len,//客户端地址的长度
void *ptr;//外部传来的回调函数要用的参数
);

原文链接:https://blog.csdn.net/qq_37299596/article/details/106093049

这篇关于Libevent3——bufferevent的特性、其事件对象的创建和销毁、给事件对象设置回调、缓冲区开启和关闭、并⭐网络通信开个头(转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os