libevent-2.0.21笔记

这篇博客主要参考了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生成', '文本转语音', '编程工具', '创业指南']
摘要由CSDN通过智能技术生成

参看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_hint

event_base_free 不会清理关联在base上的event,socket!
event_base_priority_init可设置base优先级,如果优先级设置有限则关联进来的event优先级在0至EVENT_MAX_PRIORITIES -1

运行event loop
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值