参看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可以取到底层更详细的loglog函数设置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 loopeve

这篇博客主要参考了http://www.wangafu.net/~nickm/libevent-book/ 和 libevent-2.0.21的源代码,作者挑选了evutil.c, evbuffer.c, event.c, bufferevent.c, bufferevent_sock.c等关键文件进行了解析,略过了部分他认为较为简单的内容。"
137494254,10015762,推荐4个超赞的AI开源项目,让你大开眼界!,"['人工智能', 'AI生成', '文本转语音', '编程工具', '创业指南']

1万+

被折叠的 条评论
为什么被折叠?



