参看http://www.wangafu.net/~nickm/libevent-book/ 和libevent-2.0.21源码
其中有部分我认为比较简单的,就没有记录在这里了。
关于源码,可以主要关注,evutil.c evbuffer.c event.c bufferevent.c bufferevent_sock.c 这几个文件。
-------------------------------笔记---------------------------
基础函数
用event_base_new 创建struct event_base *base ,
在bind,listen完后,
用event_new 创建struct event *listener_event用于监听是否有链接到达
通过event_add 将event添加到base中
在处理连接到达函数中添加读写event
event_base_dispatch(base),进行启动,其实就是个循环
event_free释放event
使用内置bufferevent,会自动收发数据,有点像preactor
从监听处理函数开始有变化,在监听处理函数中这么做:
struct bufferevent *bev; evutil_make_socket_nonblocking(fd); bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, readcb, NULL, errorcb, NULL);//设置读写回调 bufferevent_setwatermark(bev, EV_READ, 0, MAX_LINE); bufferevent_enable(bev, EV_READ|EV_WRITE);//设置bev关心的事件
之后只要在读回调函数中取到bufferevent内部的input,output指针
然后evbuffer_* 函数读取数据,而要发送数据只要将数据通过evbuffer_add添加到output,释放bufferevent 通过调用bufferevent_free
设置libevent
在complie libevent的时候指定CFLAGS=-DUSE_DEBUG可以取到底层更详细的log
log函数设置event_set_log_callback,log开关event_enable_debug_logging,log level标志要使用最新的,_开头的已被弃用
fatal error默认调用exit或abort,不过也可以用event_set_fatal_callback设置自己的fatal函数,不过要注意如果调用过自己的处理函数后,不能在调用libevent 任何函数
默认情况多线程是不支持的(即没有设置lock,condition等),如果要使libevent支持多线程,在event_base_new前面要调下面函数
int evthread_use_windows_threads(void);//win上设置 int evthread_use_pthreads(void); //unix上设置
如果lock有错误可以通过evthread_enable_lock_debugging进行捕捉,通过assert会exit
调试event使用event_enable_debug_mode
在使用bufferevent时,如果在创建bufferevent的时候,指定了BEV_OPT_THREADSAFE,那么new bufferevent过程的内部函数会调用bufferevent_enable_locking和evbuffer_enable_locking如果设置过了evthread_use_pthreads,那么bufferevent和从bufferevent取到的evbuffer都会变成线程安全否则bufferevent和evbuffer是不会保证线程安全的,切记
进程退出前libevent_global_shutdown做清理,其实可以不用
创建event_base,觉得默认还是直接event_base_new要好点
struct event_config *event_config_new(void); struct event_base *event_base_new_with_config(const struct event_config *cfg); void event_config_free(struct event_config *cfg);
int event_config_avoid_method(struct event_config *cfg, const char *method);int event_config_require_features(struct event_config *cfg,enum event_method_feature feature);
event_config_set_num_cpus_hintevent_base_free 不会清理关联在base上的event,socket!event_base_priority_init可设置base优先级,如果优先级设置有限则关联进来的event优先级在0至EVENT_MAX_PRIORITIES -1
运行event loop