Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。Libevent之于C语言网络编程,类似于Nettty之于Java Web编程。学习Netty的小伙伴,不防看下Libevent的实现,会加深对Netty框架的理解~
Libevent的安装教程网上较多,LZ在此就不再赘述,下面直接来点干货-Libevent如何使用。
检查Libevent支持的IO复用方法
Libevent作为一个高性能网络库,内部封装了多种IO复用技术,如果想看下Libevent在当前系统下支持哪些IO复用技术呢?
int main(int argc, char **argv) { // 版本信息 cout << event_get_version() << endl; // 所支持的IO复用方法 const char **methods = event_get_supported_methods(); for (int i = 0; methods[i] != NULL; i++) { cout << methods[i] << endl; } return 0; }
输出结果为:(Centos7 Clion 2016.1.3环境)
event_get_supported_methods()函数返回Libevent支持的IO复用方法名称数组,以NULL结尾。该函数实际返回的是全局变量eventops数组,eventops数组存放的是所有支持的IO复用函数,eventops声明部分的代码如下:
/* Array of backends in order of preference. */ /* Libevent通过遍历eventops数组来选择其后端IO复用技术,遍历的顺序是从数组的第一个元素开始, * 到最后一个元素结束。Linux系统下,默认选择的后端IO复用技术是epoll。*/ static const struct eventop *eventops[] = { #ifdef _EVENT_HAVE_EVENT_PORTS &evportops, #endif #ifdef _EVENT_HAVE_WORKING_KQUEUE &kqops, #endif #ifdef _EVENT_HAVE_EPOLL &epollops, #endif #ifdef _EVENT_HAVE_DEVPOLL &devpollops, #endif #ifdef _EVENT_HAVE_POLL &pollops, #endif #ifdef _EVENT_HAVE_SELECT &selectops, #endif #ifdef WIN32 &win32ops, #endif NULL };
Libevent是如何打日志的
libevent的错误处理底层调用的是va_start/va_end等相关宏,它们所在的头文件是<stdarg.h>,使用C函数库提供的这些函数,我们也可以实现一个自己的打日志程序,以下是一个使用va_start/va_end的测试程序:
void log(const char *fmt, ...) { char buff[512]; va_list ap; va_start(ap, fmt); int len = vsnprintf(buff, sizeof(buff), fmt, ap); buff[len] = '