使用libevent编写linux服务(一)

使用libevent编写linux服务(一)

 libevent简介

libevent是一个支持Windowslinuxbsd等平台的网络事件驱动程序库。它支持多种I/O服用机制,按照优先级从高到低依次为:evportkqueueepolldevpollrtsigpollselect。它可根据操作系统,按照优先级从高到底自主选择驱动。

     用户可以通过http://www.monkey.org/~provos/libevent/来获取libevent的源码、libevent出现的背景、以及其他一些详细资料。

 libevent的使用

初始化事件  

我们首先完成对libenvent的事件初始化和事件驱动模型的选择。(在使用多线程的情况下,一般我们需获取所返回的事件根基)

main_base = event_init();

  

event_init函数返回的是一个event_base对象,该对象包括了事件处理过程中的一些全局变量,其结构为:

struct event_base {
    const struct eventop *evsel;
    void *evbase;
    int event_count;        /* counts number of total events */
    int event_count_active; /* counts number of active events */

int event_gotterm;      /* Set to terminate loop */
    int event_break;        /* Set to terminate loop immediately */

    /* active event management */
    struct event_list **activequeues;
    int nactivequeues;

    /* signal handling info */
    struct evsignal_info sig;

    struct event_list eventqueue;
    struct timeval event_tv;

    struct min_heap timeheap;

    struct timeval tv_cache;
};

添加事件

        在事件初始化完毕后,我们可以使用event_set设置事件,然后使用event_add将其加入。

   这里我们首先完成socket的监听,然后将其加入的事件队列中(这里我们对所有的异常都不做考虑)。

1socket监听

struct sockaddr_in listen_addr;

int port = 10000; //socket监听端口

   int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

   memset(&listen_addr, 0, sizeof(listen_addr));

    listen_addr.sin_family = AF_INET;
    listen_addr.sin_addr.s_addr = INADDR_ANY;
    listen_addr.sin_port = htons(port)

   reuseaddr_on = 1;

setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_on, sizeof(reuseaddr_on)) #支持端口复用

bind(listen_fd, (struct sockaddr *) &listen_addr, sizeof(listen_addr))'

listen(listen_fd, 1024);

/*将描述符设置为非阻塞*/

int flags = fcntl(listen_fd,, F_GETFL);

flags |= O_NONBLOCK;

fcntl(listen_fd, F_SETFL, flags);

2)事件设置

      socket服务建立后,就可以进行事件设置。我们使用event_set来设置事件对象,其传入参数包括事件根基(event_base对象),描述符,事件类型,事件发生时的回调函数,回调函数传入参数。其中事件类型包括EV_READEV_WRITEEV_PERSISTEV_PERSIST和前两者结合使用,表示该事件为持续事件。

struct event ev;

event_set(&ev, listen_fd, EV_READ | EV_PERSIST, accept_handle, (void *)&ev);

3)事件添加与删除

         事件设置好后,就可以将其加入事件队列。event_add用来将事件加入,它接受两个参数:要添加的事件和时间的超时值。 如果需要将事件删除,可以使用event_del来完成。event_del函数会取消所指定的事件。

event_add(&ev, NULL)

进入事件循环

    事件成功添加后就是万事具备只欠东风了,libevent提供了多种方式来进入事件循环,我个人常用的是event_dispatchevent_base_loop,前者最后实际是使用当前事件根基来调用event_base_loop

   event_base_loop(main_base, 0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值