libevent学习七(bufferevent)

1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用。

2.读取和写入数据是通过编写和设置对应的回调函数进行,而调用回调函数的时机则根据水位是否满足来的,水位又是可以设置的。默认情况下读的低水位是0,就是说libevent从底层读到大于0的数据到input buffer中,读回调函数就会调用,读回调函数读取input buffer的数据;同样默认的写水位也为0,就是说一旦output buffer中没有数据,就会调用写回调函数写入数据到output buffer,ouput buffer会自动由libevent传出到对端。

3.bufferevent 除了有读写事件还有其他事件

BEV_EVENT_READING:读过程中发生的事件

BEV_EVENT_WRITING  :写过程中发生的事件

BEV_EVENT_ERROR:操作过程中发生的事件

BEV_EVENT_TIMEOUT:超时事件

BEV_EVENT_EOF:到达文件末尾

BEV_EVENT_CONNECTED:连接成功事件

4.bufferevent的选项

BEV_OPT_CLOSE_ON_FREE:释放bufferevent的时候释放掉底层的socket和底层的bufferevent

BEV_OPT_THREADSAFE:自动上锁,多线程安全

BEV_OPT_DEFER_CALLBACKS:延迟所有的回调函数(通常情况下,回调函数在满足条件的情况下是立即执行,但是同时执行的回调函数太多会可能会导致栈溢出,所以可以延迟回调函数的调用,使其成为事件循环的一部分,放入队列,等待其他的队列之前的回调函数被调用后在调用)

BEV_OPT_UNLOCK_CALLBACKS :在执行用户提供的回调函数时解锁。

5.接口

//new一个基于socket的bufferevent,如果传入的socket fd为-1,则自动创建一个面向流的socket fd

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

//如果bev指向的基于socket的bufferevent中的socket fd没有连接,则自动连接

//没有连接之前是不可能从底层读写数据的,但是可以向output buffer写数据

int bufferevent_socket_connect(struct bufferevent *bev,
    struct sockaddr *address, int addrlen);

//监控到连接事件成功的事件后,需要主动写入一次,不然写回调函数不会触发,有点奇怪,但也可以理解

//通过主机名建立连接

int bufferevent_socket_connect_hostname(struct bufferevent *bev,
    struct evdns_base *dns_base, int family, const char *hostname,
    int port);
int bufferevent_socket_get_dns_error(struct bufferevent *bev);

//释放bufferevent

void bufferevent_free(struct bufferevent *bev);

//设置或获取回调函数

//客户端的写入回调需要一个激活的过程,最好放在连接事件激活时来做

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

    short events, void *ctx);

//如果事件指针设置为NULL则表示不启用该事件的处理方式

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

void bufferevent_getcb(struct bufferevent *bufev,
    bufferevent_data_cb *readcb_ptr,
    bufferevent_data_cb *writecb_ptr,
    bufferevent_event_cb *eventcb_ptr,
    void **cbarg_ptr);

//打开或关闭事件处理过程( EV_READ, EV_WRITE, or EV_READ|EV_WRITE)

//默认情况下新建的buffervent打开了写事件的处理过程,没有打开读的处理过程

void bufferevent_enable(struct bufferevent *bufev, short events);
void bufferevent_disable(struct bufferevent *bufev, short events);

short bufferevent_get_enabled(struct bufferevent *bufev);

//设置读写水位

//events为( EV_READ,EV_WRITE的组合)

void bufferevent_setwatermark(struct bufferevent *bufev, short events,
    size_t lowmark, size_t highmark);

//获取读写evbuffer

struct evbuffer *bufferevent_get_input(struct bufferevent *bufev);
struct evbuffer *bufferevent_get_output(struct bufferevent *bufev);

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

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

    struct evbuffer *buf);

//设置读写超时时间

void bufferevent_set_timeouts(struct bufferevent *bufev,

    const struct timeval *timeout_read, const struct timeval *timeout_write);

//强制写入或读取

int bufferevent_flush(struct bufferevent *bufev,
    short iotype, enum bufferevent_flush_mode state);

//锁和解锁

void bufferevent_lock(struct bufferevent *bufev);
void bufferevent_unlock(struct bufferevent *bufev);

//其他接口

int bufferevent_priority_set(struct bufferevent *bufev, int pri);
int bufferevent_get_priority(struct bufferevent *bufev);

int bufferevent_setfd(struct bufferevent *bufev, evutil_socket_t fd);
evutil_socket_t bufferevent_getfd(struct bufferevent *bufev);

struct event_base *bufferevent_get_base(struct bufferevent *bev);

struct bufferevent *bufferevent_get_underlying(struct bufferevent *bufev);

时间: 2024-08-09 21:51:40

libevent学习七(bufferevent)的相关文章

libevent学习七

Bufferevents:概念和基础 很多时候,一个程序需要处理一些数据的缓存,不止应用在答复event上.例如:当我们需要去写出数据,通常会这样做: 1. 发现有数据需要写出到一条连接上:把这些数据放到buffer里. 2. 等连接变成可写的状态. 3. 尽可能的写入数据. 4. 记住我们写了多少数据,然后如果数据没有全部写完,就等连接再次变为可写的状态. 这种IO缓冲模式已经足够Libevent的日常使用.一个"bufferevent"是由一个底层传输渠道(如socket),一个读

springMVC3学习(七)--Interceptor拦截器

Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口, org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器, 实现这个接口或继承此类,能够很方便的实现自己的拦截器. 有下面三个方法: Action之前运行 public boolean preHandle(HttpServletRequest request, HttpServletR

libevent学习之二:Windows7(Win7)下编译libevent

Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http://libevent.org/ 二.使用VS2012编译 1.解压libevent到C:\Users\zhang\Desktop\libevent-2.0.22-stable 2.打开“VS2012开发人员命令提示”工具,如下图所示. 3.输入指令开始编译,如下图所示. 有网友说编译之前应该在以下3个文

Spark学习七:spark streaming与flume集成

Spark学习七:spark streaming与flume集成 标签(空格分隔): Spark 一,启动flume flume-conf.properties文件 agent002.sources = sources002 agent002.channels = channels002 agent002.sinks = sinks002 ## define sources agent002.sources.sources002.type = exec agent002.sources.sour

CorePlot学习七---坐标轴的详细分析

先看代码,有标注,很详细,看看是如何设定x.y轴的可视范围.移动范围.已经如何确定原点的位置的.还有就是如何固定坐标轴!!! //坐标轴的初始化 -(void)axesInit { // Setup plot space: 设置一屏内可显示的x,y量度范围 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)[xyGraph defaultPlotSpace]; plotSpace.delegate = self; plotSpace.allowsUser

libevent学习__学习历程总结

The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. 环境搭建 下载: http

libevent学习笔记-使用指导

windows下Code::Blocks建立GNU编译的工程: 1.需要添加如下头文件: D:\E\programing\levent-libevent\include D:\E\programing\levent-libevent\gnu\includeC:\Program Files\Dev-Cpp\MinGW32\include 2.需要添加如下静态库: ws2_32 kernel32 user32 gdi32 winspool shell32 ole32 oleaut32 uuid co

cesium 学习(七) HeadingPitchRoll

cesium 学习(七) HeadingPitchRoll 一.前言 对于模型旋转变换.相机视角变换以及方向变换的处理操作,也就是改变heading.pitch.roll这三个的值.这三个值代表什么意思呢?接下来就专门介绍一下Cesium的HeadingPitchRoll. 二.HeadingPitchRoll HeadingPitchRoll其实也就是欧拉(Euler)角:   机体坐标系与地面坐标系的关系是三个Euler角:yaw,pitch,roll,反应了飞机相对地面的姿态.也就是说Ya

libevent学习笔记 一、基础知识

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46485705 一.libevent是什么 libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制. 它被众多的开源项目使用,例如大名鼎鼎的memcached等. 特点: 事件驱动,高性能; 轻量级,专注于网络(相对于ACE); 开放源码