直接看代码吧,注释写的很详细了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include<iostream>
#include<sys/types.h>
#include<event2/event.h>
//通用的libevnet消息回调接口,其中fd和event都是注册event的时候提供的标识符
//pArg也是注册事件的时候,告诉libevent的,让它传给自己
void
OnTimer(evutil_socket_t fd,
short
event,
void
* pArg)
{
//这里不做任何判断,合乎常规的方法是对fd和event进行下校验
const
char
* pStrMsg = (
const
char
*)pArg;
std::cout << pStrMsg << std::endl;
std::cout <<
"fd is "
<< (
int
)fd << std::endl;
//event 之所以为1是由于超时
//event 的值一般都是EV_TIMEOUT | EV_READ | EV_WRITE 的组合
std::cout <<
"event is "
<< (
int
)event << std::endl;
//libevent不关心消息处理的怎么样
return
;
}
int
main(
int
argc,
char
* argv[])
{
//所有使用libevent的初始化语句
struct
event_base* pBase = event_base_new();
if
(pBase == NULL)
{
std::cout <<
"初始化libevent失败"
<< std::endl;
return
0;
}
//时间间隔是3秒
struct
timeval tv = {3, 0};
//为event事件赋值,这个event事件需要等待定时器对象
//这里有点特殊,为什么fd参数填-1, event填0呢?貌似文档上面没有说明
struct
event* pEvent = event_new(pBase, -1, 0, OnTimer, (
void
*)
"this is just a test of livevent!"
);
if
(pEvent == NULL)
{
std::cout <<
"建立事件对象失败"
<< std::endl;
return
0;
}
//添加事件到libevent中,第二个参数其实是这个事件的等待超时时间,当前是等待3秒钟而已
//第二个参数为NULL的时候,意味着事件必须无限制的等待
int
nRet = event_add(pEvent, &tv);
if
(nRet == -1)
{
std::cout <<
"添加3秒定时器失败"
<< std::endl;
return
0;
}
//好了,已经添加完成了event之后,就需要进入消息循环等待时间的发生了
int
nFlag = 0;
if
( -1 == (nFlag = event_base_dispatch(pBase)))
{
//这里非正常终止的原因是
std::cout <<
"消息循环非正常终止了"
<< std::endl;
}
else
if
(1 == nFlag)
{
std::cout <<
"没有事件需要等待了"
<< std::endl;
}
//清理资源
event_free(pEvent);
event_base_free(pBase);
return
1;
}
|