如何安装
Libevent 是一个高性能,跨平台的 C 语言网络库。Libevent 当前最新的版本是 2.1.8,下面是在 Linux 安装 Libevent 的步骤:
基本概念
Libevent是基于 Reactor 模式的网络库,在 Reactor 模式中,通常都有一个事件循环(Event Loop),在 Libevent 中,这个事件循环就是event_base
结构体:
通常来说,事件循环主要有两个作用:
- 用来管理事件,比如说添加我们感兴趣的事件,修改事件或删除事件。
- 用来轮询它管理的所有事件,如果发现有事件活跃 (avtive),就调用相应的回调函数去处理事件。
Libevent 使用event
结构体来代表事件,可以使用event_new()
创建一个事件:
创建一个事件之后,要怎么把它加入到事件循环呢?可以使用event_add()
函数:
默认情况下,当一个事件变得活跃时,Libevent 会执行这个事件的回调函数,但同时也会将这个事件从事件循环中移除,例如,下面的程序,定时器只会触发一次:
那要怎么样才能让事件不被移除呢?当创建事件时,在事件类型加上EV_PERSIST
就可以。让我们修改上面的程序,让定时器每秒就触发一次:
TCP Server
Libevent 使用evconnlistener
结构来表示 TCP Server,创建 TCP Server 的做法很简单:
调用evconnlistener_new_bind()
函数之后,listening socket 会自动被设置成非阻塞的。我们还通过flags
参数设置一些有用的选项,例如:
LEV_OPT_CLOSE_ON_FREE
表示当调用evconnlistener_free()
时,相应的 listening socket 也会被close()
掉。LEV_OPT_REUSEABLE
表示会自动对 listening socket 设置SO_REUSEADDR
这个 TCP 选项。
下面的程序创建了一个简单的 TCP Server: