bufferevent.h
传递到事件回调函数的事件
#define BEV_EVENT_READING 0x01 /**< 读取过程中遇到的错误 */
#define BEV_EVENT_WRITING 0x02 /**< 写数据过程中遇到错误 */
#define BEV_EVENT_EOF 0x10 /**< 读到了文件结束符EOF */
#define BEV_EVENT_ERROR 0x20 /**< 遇到了不可恢复的错误 */
#define BEV_EVENT_TIMEOUT 0x40 /**< 表示计时器的时间到了 */
#define BEV_EVENT_CONNECTED 0x80 /**< 表示connect操作完成 */
读写回调函数的原型
/*
这是一个用于bufferevent的读写回调函数
当有新数据到达input buffer时且数据量高于低水位(默认为0),读回调被触发。
当output buffer被清空(已经发送完了)或者低于低水位时,写回调被触发。
@param bev 被调用的函数所属的bufferevent
@param ctx 用户所定义的内容
*/
typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
错误回调函数的原型
/**
bufferevent的错误或者特别事件的回调函数
这个回调会在读到EOF或者遇到不可恢复的错误时被触发
@param bev 遇到错误条件的bufferevent
@param what 是一个联合标志,包含BEV_EVENT_READING 或者 BEV_EVENT_WRITING其中之一表示 错误是在读数据还是写数据时产生,另外还包含一下其中之一个标志 BEV_EVENT_EOF,BEV_EVENT_ERROR,BEV_EVENT_TIMEOUT, BEV_EVENT_CONNECTED
@param ctx 用户指定的内容
*/
typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx);
创建bufferevent时的可选项
/** Options that can be specified when creating a bufferevent */
enum bufferevent_options {
/** If set, we close the underlying file
* descriptor/bufferevent/whatever when this bufferevent is freed. */
BEV_OPT_CLOSE_ON_FREE = (1<<0),
/** 如果设置了,且多线程选项被打开,则此buffervent受锁保护 */
BEV_OPT_THREADSAFE = (1<<1),
/** If set, callbacks are run deferred in the event loop.(延迟回调?) */
BEV_OPT_DEFER_CALLBACKS = (1<<2),
/** If set, callbacks are executed without locks being held on the
* bufferevent. This option currently requires that
* BEV_OPT_DEFER_CALLBACKS also be set; a future version of Libevent
* might remove the requirement.*/
BEV_OPT_UNLOCK_CALLBACKS = (1<<3)
};
创建bufferevent
/**
基于一个已存在的socket来创建一个socket bufferevent
@param base 指定为哪个事件循环分配bufferevent
@param fd 需要进行读写的socket文件描述符.
该文件描述符不可是管道( pipe(2)).
fd可以为-1,只要之后调用bufferevent_setfd(重设fd)或者调用bufferevent_socket_connect()(连接不用fd)
@param options 选项可以为0或者BEV_OPT_*类的标志(参考上一段)
@返回新创建的bufferevent结构体的指针,如果出现错误则返回NULL
@see bufferevent_free()
*/
struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);
发起连接connect
/**
Launch a connect() attempt with a socket-based bufferevent.
When the connect succeeds, the eventcb will be invoked with
BEV_EVENT_CONNECTED set.
If the bufferevent does not already have a socket set, we allocate a new
socket here and make it nonblocking before we begin.
If no address is provided, we assume that the socket is already connecting,
and configure the bufferevent so that a BEV_EVENT_CONNECTED event will be
yielded when it is done connecting.
@param bufev an existing bufferevent allocated with
bufferevent_socket_new().
@param addr the address we should connect to
@param socklen The length of the address
@return 0 on success, -1 on failure.
*/
int bufferevent_socket_connect(struct bufferevent *, struct sockaddr *, int);