libevent初体验
2012-03-13 18:49 听雨到天明 阅读(294) 评论(0) 收藏 举报直接看代码吧,注释写的很详细了
#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;
}
浙公网安备 33010602011771号