代码改变世界

libevent初体验

2012-03-13 18:49  听雨到天明  阅读(290)  评论(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;
}