bufferevent是libevent中处理网络事件很重要也是比较复杂的一个模块,其中包含一个读事件,一个写事件,两个缓冲区(读和写)、读写水位、三个回调(读、写、出错)和函数指针组成的操作集。目前支持的操作集有五种:基于socket的,基于pair的,基于过滤的及基于SSL,异步(WIN32 iocp)的五种。bufferevent的结构为

struct bufferevent {/** Event base for which this bufferevent was created. */struct event_base *ev_base;/** Pointer to a table of function pointers to set up how thisbufferevent behaves. */const struct bufferevent_ops *be_ops;  //操作集/** A read event that triggers when a timeout has happened or a socketis ready to read data.  Only used by some subtypes ofbufferevent. */struct event ev_read;  //读事件/** A write event that triggers when a timeout has happened or a socketis ready to write data.  Only used by some subtypes ofbufferevent. */struct event ev_write;  //写事件/** An input buffer. Only the bufferevent is allowed to add data tothis buffer, though the user is allowed to drain it. */struct evbuffer *input;   //输入缓冲区/** An input buffer. Only the bufferevent is allowed to drain datafrom this buffer, though the user is allowed to add it. */struct evbuffer *output;        //输出缓冲区struct event_watermark wm_read;  //读操作的水位struct event_watermark wm_write;    //写操作的水位bufferevent_data_cb readcb;    //用于应用层读操作的回调bufferevent_data_cb writecb;    //用于应用层写操作的回调/* This should be called 'eventcb', but renaming it would break* backward compatibility */bufferevent_event_cb errorcb;   //出错时的回调void *cbarg;struct timeval timeout_read;struct timeval timeout_write;/** Events that are currently enabled: currently EV_READ and EV_WRITEare supported. */short enabled;
};

1. bufferevent的选项
bufferevent有四种选项:
BEV_OPT_CLOSE_ON_FREE:释放缓冲区时关闭socket描述符
BEV_OPT_THREADSAFE:开启线程情况下,bufferevent由锁来同步
BEV_OPT_DEFER_CALLBACKS:回调添加到event_base中的回调,由event_base事件循环来处理
BEV_OPT_UNLOCK_CALLBACKS:无锁回调,这个选项需要与BEV_OPT_DEFER_CALLBACKS一起使用。
2. bufferevent中的水位
bufferevent中读操作的低水位是用于应用层读,如果输入缓冲区的数据长度大于低水位,则调用应用层的读回调,而高水位是用于控制socket I/O的读操作,如果输入缓冲区的数据长度大于高水位,就将删除socket的读事件,即不将socket中的数据读入输入缓冲区中。而写操作的低水位,如果输出缓冲区的数据长度小于低水位则调用应用层的写操作,将数据写入输入缓冲区中,而针对socket,syn,pair,ssl,filter这几种bufferevent操作有不同的含义。
3. 读写事件的开启关闭
设置水位后,读写事件的开启关闭是根据水位来动态调节,其函数为

void bufferevent_suspend_read(struct bufferevent *bufev, bufferevent_suspend_flags what)
void bufferevent_unsuspend_read(struct bufferevent *bufev, bufferevent_suspend_flags what)
void bufferevent_suspend_write(struct bufferevent *bufev, bufferevent_suspend_flags what)
void bufferevent_unsuspend_write(struct bufferevent *bufev, bufferevent_suspend_flags what)

4. 应用层事件的回调
应用层事件的回调分为延时的和无延时的的。延时回调是在设置了BEV_OPT_DEFER_CALLBACKS属性后,事件放在event_base事件循环中来处理的。其相应的函数为

void bufferevent_run_deferred_callbacks_locked(struct deferred_cb *_, void *arg)
void bufferevent_run_deferred_callbacks_unlocked(struct deferred_cb *_, void *arg)
void _bufferevent_run_readcb(struct bufferevent *bufev)
void _bufferevent_run_writecb(struct bufferevent *bufev)
void _bufferevent_run_eventcb(struct bufferevent *bufev, short what)

libevent中的bufferevent相关推荐

  1. libevent中的缓冲区(一)

     libevent中的缓冲区定义为evbuffer,主要在文件evbuffer-internal.h文件中,定义如下 struct evbuffer {/** The first chain in ...

  2. libevent中的基本数据结构

     libevent中文件queue.h文件包含5种数据结构:单链表,双向链表,队列,尾队列,环形队列.在处理I/O和signal中的事件时,用的就是尾队列,下面就介绍这几种数据结构 1.单链表 链表 ...

  3. libevent中事件的添加与删除

     前面介绍了libevent中的hash表,在添加事件时,具体是如何操作的呢?事件操作主要是在evmap.c文件中,包含了io事件,signal事件的操作.在事件操作时,分两种情况,一种是利用ha ...

  4. libevent中的信号处理

    libevent中将信号集成到event_base_loop事件循环中,通过socketpair转换成I/O事件,本文主要介绍相关的转换. 1.将信号转成I/O 采用socket pair方式,一个s ...

  5. libevent中的时间及相关的管理

    libevent中的时间及相关的管理 在介绍时间之前,先说明几个与时间相关的函数及其用法 1.基础 1.1 clock_gettime(精度比较高,ns级) #include <time.h&g ...

  6. libevent中的hash表

    libevent中的hash表的代码在ht-internal文件中,在添加io事件,signal事件时,底层是在操作  event_io_map和event_signal_map 1. hash的 ...

  7. 在libevent中使用线程池

    一 线程的初始化 1线程对象 在进行事件驱动时,每个线程需建立自己的事件根基.由于libevent未提供线程之间通信的方式,我们采用管道来进行线程的通信.同时为方便主线程分配线程,我们还需保留各个线程 ...

  8. 在 libevent 中使用 MariaDB(MySQL)

    在之前我翻译的官方文档中提到了 MariaDB 提供了对异步 I/O 的支持.那篇文章是一个比较简要的介绍.不过实际适配中,官方也提供了一个完整适配 libevent 的示例代码.本文算是对我上述示例 ...

  9. libevent多线程使用bufferevent的那些事

    void do_accept(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen ...

最新文章

  1. java项目教学_java项目_java项目教程_java项目视频教程 _课课家
  2. tensorflow下载
  3. 计算机控制论文,计算机控制系统论文.ppt
  4. Java+Selenium3.0----------启动谷歌浏览器及错误处理
  5. gateway网关_使用Sentinel实现gateway网关及服务接口限流
  6. JS—触摸事件、手势事件
  7. [渝粤教育] 西南科技大学 农业技术经济学 在线考试复习资料
  8. rails mysql2 mac_用Mac osx10.6在Ruby on Rails上安裝mysql2 gem。
  9. 千锋教育JavaScript视频教程笔记
  10. 腾讯翻译君 VS 谷歌翻译
  11. 基于51单片机的简易计算器
  12. python画密度散点图_python散点图密度怎么计算
  13. day05匿名函数,内置函数,二分法,递归,模块
  14. Docker部署微服务应用笔记(三)
  15. celeron处理器_桌面级【CPU】处理器简介——之【intel】篇
  16. 机器学习中的评估指标与损失函数
  17. 利用Ajax访问后台数据
  18. app 嵌套h5页面问题
  19. 最优性理论(无约束)
  20. 用Python分析微博股市热度和A股走势的关联

热门文章

  1. quick cocos2d x 手机(Android端)启动过程学习
  2. spring 框架概述
  3. 华为面试题之大整数相加
  4. python自动化办公入门书籍推荐-好书推荐 | Python 如此神奇,让繁琐工作自动化...
  5. python这个软件学会能做什么工作-工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
  6. 安装完python后、还需要安装什么-初学 Python 需要安装哪些软件?
  7. python编程软件例子-python面向对象编程实例
  8. python爬虫入门-Python 爬虫从入门到进阶之路(一)
  9. 怎么自学python语言-python应用:零基础Python应该怎样学习呢?
  10. python免费入门教程-python入门免费教程看这些就够了