作为一名服务器开发人员来说,不管你用的是什么语言,掌握一门网络库也是非常有必要的。
本人为什么会下定决心研究通信、序列化/发序列化、数据库(nosql/sql)、高级队列等服务器端的各模块三方库呢?其实原因如下几点:
1.总是调用别人封装的接口,屏蔽了最应该知道的东西,反复的做这样的工作我们有什么价值吗?离开了这个工作岗位我们还有什么竞争力吗?相信这一点大家都很清楚
2.有些三方库我们自己用了,有时候只是知道简单的接口,那么如果出问题了,我们该如何定位呢?相信这时候应该知道原理的重要性
3.如果知道某些组件或者开源的三方库原理了,我们为什么不进一步考虑多节点、容灾处理、程序健壮性问题呢?
基于上面几点,本人也是痛定思痛,不能只浮在表面,要沉下心,去做这件事。
其实在谈到网络库的选择的时候我们如何从众多网络库中去选择呢?
1.功能(tcp/udp/http/https/dns)
网络库提供的功能,能否解决我们的痛点需求。
2.平台兼容性(linux/windows/unix)
如果你只需要一个平台,那么只要库支持就这个平台就ok,如果你需要多平台那么要考虑它的平台兼容性
3.效率
在满足上面两点的情况下,当然是效率越高越好了。
4.库的复杂度
满足上面三条,当然是容易上手的库为最佳选择,在3、4冲突时,根据自己的痛点选择
这一条是补加的,因为有小伙伴不会安装libevent,我写了个一键执行的脚本解决你的痛点,目录下的.sh文件就是执行脚本,下载到你机器上执行即可:
https://github.com/starqingzhu/shell_all/tree/master/libevent_install
好了说了这么,多那么我们就来说说libevent吧
1.libevent简介
轻量级的网络库
支持平台:windows、linux、unix
轻量级:专注网络
支持 I/O,定时器和信号等事件
支持I/O的多路复用技术(epoll/poll/select/kqueue)
高性能:事件驱动
libevent是reactor反应堆模式(高效服务器架构reactor/proactor自行去脑补)
2.如何使用libevent呢?
已tcp为例吧:
1)创建socket,获得socket 文件描述符
2)创建事件集event_base
struct event_base *event_base_new(void);
3)创建事件
typedef void (*event_callback_fn)(evutil_socket_t, short, void *);
struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
参数1:就是2中的事件集对象
参数2:就是你要监控的socket fd
参数3:就是你要监控该fd上的哪些事件 eg:EV_READ
参数4:事件发生时,回调函数 格式如event_callback_fn
4)将事件添加到事件集
int event_add(struct event *ev, const struct timeval *timeout);
5)让进程/线程进入循环,监听等待事件发生,并回调对应事件的处理函数。
这两个都可以,取其一即可。
int event_base_dispatch(struct event_base *);
int event_base_loop(struct event_base *, int);
当然我不是在这瞎说,为了证明我说的是对的,当然我会写demo,呈上我的github地址:
https://github.com/starqingzhu/simple_libevent
3.原理
大家先看下图,我改日在剖析

