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

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo