首页 > 其他分享 >Libevent的bufferevent事件(三)

Libevent的bufferevent事件(三)

时间:2023-12-05 20:11:37浏览次数:28  
标签:struct bufferevent 函数 事件 Libevent 缓冲区 回调 socket

一、什么是bufferevent事件

bufferevent实际上也是一个event,只不过比普通的event高级一些,它的内部有两个缓冲区,以及一个文件描述符(网络套接字)。我们都知道一个网络套接字有读和写两个缓冲区,bufferevent同样也带有两个缓冲区,还有就是libevent事件驱动的核心回调函数,那么四个缓冲区以及触发回调的关系如下所示:

 有三个回调函数:

  • 读回调:当bufferevent将底层读缓冲区的数据读到自身的读缓冲区时触发读事件回调
  • 写回调:当bufferevent将自身写缓冲区的数据写到底层写缓冲区的时候触发写事件回调
  • 事件回调:当bufferevent绑定的socket连接,断开或者异常的时候触发事件回调

二、主要使用的函数

1.bufferevent_socket_new函数

struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);

bufferevent_socket_new对已经存在的socket创建bufferevent事件,参数说明:

  • base:对应根节点
  • fd:文件描述符
  • options:bufferevent的选项
  1. BEV_OPT_CLOSE_ON_FREE:释放bufferevent自动关闭底层接口
  2. BEV_OPT_THREADSTAFE:使bufferevent能够在多线程下是安全的

2.bufferevent_socket_connect函数

int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *serv, int socklen);

bufferevent_socket_connect封装了底层的socket与connect接口,通过调用此函数,可以将bufferevent事件与通信的socket进行绑定,参数如下:

  • bev:需要提前初始化的bufferevent事件
  • serv:对端的ip地址,端口,协议的结构指针
  • socklen:描述serv的长度

3.bufferevent_free函数

void bufferevent_free(struct bufferevent *bufev);

释放bufferevent  

4. bufferevent_setcb函数

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

bufferevent_setcb用于设置bufferevent的回调函数,readcb,writecb,eventcb分别对应了读回调,写回调,事件回调,cbarg代表回调函数的参数。回调函数的原型:

typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx);

what对应的事件:BEV_EVENT_EOF, BEV_EVENT_ERROR,BEV_EVENT_TIMEOUT, BEV_EVENT_CONNECTED 

5.bufferevent_write函数

int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);

bufferevent_write是将data的数据写到bufferevent的写缓冲区。

6.bufferevent_write_buffer函数

int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);

bufferevent_write_buffer 是将数据写到写缓冲区另外一个写法,实际上bufferevent的内部的两个缓冲区结构就是struct evbuffer。  

7.bufferevent_read函数

size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);

bufferevent_read 是将bufferevent的读缓冲区数据读到data中,同时将读到的数据从bufferevent的读缓冲清除。

8.bufferevent_read_buffer函数

int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf);

bufferevent_read_buffer 将bufferevent读缓冲数据读到buf中,接口的另外一种。

9.bufferevent_enable和bufferevent_disable函数

int bufferevent_enable(struct bufferevent *bufev, short event);
int bufferevent_disable(struct bufferevent *bufev, short event);

bufferevent_enable与bufferevent_disable是设置事件是否生效,如果设置为disable,事件回调将不会被触发。  

标签:struct,bufferevent,函数,事件,Libevent,缓冲区,回调,socket
From: https://www.cnblogs.com/TechNomad/p/17878074.html

相关文章

  • 调查显示 IT 服务事件越来越频繁
    事件管理平台提供商Transposit对美国1,000名IT运营、DevOps、站点可靠性工程(SRE)和平台工程专业人士进行的一项调查发现,超过三分之二(67%)的人发现故障率有所增加过去12个月中影响客户的服务事件的频率。今天在Kubecon+CloudNative会议上宣布的调查发现,62%的受访者......
  • WPF 最大化,最小化,关闭,拖拽,双击事件
    十年河东,十年河西,莫欺少年穷学无止境,精益求精代码如下publicMainView(){InitializeComponent();//最小化btnMin.Click+=(s,e)=>{this.WindowState=WindowState.Minimized;};//最大化b......
  • js事件
    JavaScript支持多种事件,事件是在文档(DOM)或浏览器窗口中发生的事情。以下是一些常见的JavaScript事件:鼠标事件(MouseEvents):click-鼠标单击dblclick-鼠标双击mousedown-按下鼠标按钮mouseup-松开鼠标按钮mousemove-移动鼠标mouseover-鼠标移入mouseout-......
  • Libevent的入门级使用
    一、Libevent的地基event_base在使用libevent的函数之前,需要先申请一个或event_base结构,相当于盖房子时的地基,在event_base基础上会有一个事件集合,可以检测哪个事件是激活的(就绪),通常情况下可以通过event_base_new函数获得event_base结构,函数如下:structevent_base*event_bas......
  • MySQL选择题(四) 事件/触发器
    单选在MySQL中,关于触发器,以下说法正确的是:a.可以对临时表创建触发器b.对INFORMATION_SCHEMA或performance_schema中的表,可以创建触发器c.对于InnoDB表,即使触发器中的语句执行失败,当在触发操作是执行后执行语句时,作为触发条件的SQL也会成功执行。d.对于同一个表,可以定义......
  • Libevent的安装与使用(一)
    一、了解libeventLibevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动(event-driven),高性能;轻量级专注于网络,不如ACE那么臃肿庞大;源代码相当精炼、易读;跨平台,支持Windows、Linux、*BSD和MacOs;支持多种I/O多路复用技术,epoll、......
  • 精通C#要点:解析委托、匿名方法与事件
    文章目录委托(Delegate)委托的特性声明委托实例化委托委托的多播(MulticastingofaDelegate)委托的用途匿名方法委托实际应用场景事件(Event)声明事件事件实例1事件实例2事件实例3委托和事件的区别总结 委托(Delegate)委托是对具有特定参数列表和返回类型的方法的......
  • 鼠头鸭脖事件背后的思考:食品安全为何屡出纰漏?如何监管才能做到百密不疏?
    一、方案背景近日,震惊全网的“鼠头鸭脖”事件得以落幕,在大家的见证下,官方也做出了公证处理,仅在2023年就有两起高校“鼠头”事件曝出,以至于让大家对高校食堂产生了心理阴影。虽然事后有关部门进行了严肃处理,但食品安全的监管依然是大家十分关注的。除了人工监管以外,AI智能监控的参......
  • 使用观察者模式实现窗体间按钮点击事件的解耦
    为了温故而知新,本博客旨在记录我学习VB.net编程的过程,分享基础知识和实用技巧,帮助有需要的朋友轻松入门VB.net编程。无论您是想开发Windows平台上的应用程序,还是想在.NET生态系统中展现创造力和创新精神,本文都将为您提供宝贵的指导。在软件开发中,经常会遇到一个窗体上的按钮点击......
  • VB.NET实现一键触发另一个窗体按钮点击事件的妙招
    为了温故而知新,本博客旨在记录我学习VB.net编程的过程,分享基础知识和实用技巧,帮助有需要的朋友轻松入门VB.net编程。无论您是想开发Windows平台上的应用程序,还是想在.NET生态系统中展现创造力和创新精神,本文都将为您提供宝贵的指导。在VB.NET中,我们经常需要在一个窗体上点击按钮......