学习使用libevent(一)

PRE——写在前面的话

最近在学习libevent,希望可以好好整理一下~

计划是这样,先简单总结一下怎么使用它,然后开始分析源代码。

其实,目前网上已经有不少相关资料,比如说,官网(http://libevent.org/)为我们提供的Documentation,还有http://cpp.ezbty.org/的《libevent源码深度剖析系列》,这里再总结一下,也算是对自己的提高吧。

废话不再多说,接下来,本文将具体介绍libevent的使用。

libevent简介

首先简单介绍一下libevent,它是一个开源的轻量级网络库,具有良好的跨平台特性,支持Linux, FreeBSD, OpenBSD, NetBSD, Mac OS X, Solaris, Android等各种平台,支持多种不同的I/O多路复用机制。它采用的是基于事件驱动(event-driven)的模型,这里的事件包括有:I/O,定时器,信号等。

event和event_base是其最核心的部分。

event_base

一、创建event_base

有两种方式。

第一,默认方式创建;

struct event_base *event_base_new(void);

默认情况下,libevent会选择该平台下效率最高的I/O多路复用机制作为其backend使用的method。

第二,自定义方式创建;

struct event_config *event_config_new(void);
struct event_base *event_base_new_with_config(const struct event_config *cfg);
void event_config_free(struct event_config *cfg);
首先,调用event_config_new()函数创建一个event_config对象,然后调用下面即将讲到的几个接口来指定method属性,再调用event_base_new_with_config()创建对应的event_base,创建完以后,event_config就没用了,别忘了释放掉。libevent为我们提供的这些接口函数有:

int event_config_avoid_method(struct event_config *cfg, const char *method);

int event_config_require_features(struct event_config *cfg, enum event_method_feature feature);

int event_config_set_flag(struct event_config *cfg, enum event_base_config_flag flag);

第一个,很直白地告诉libevent不希望使用哪个method,传入参数就是method的名字,比如说"epoll";

第二个,告诉libevent需要支持哪些features,包括有:

    EV_FEATURE_ET 支持边沿触发方式(epoll)

    EV_FEATURE_O1 事件插入删除查找的时间复杂度均为O(1)(epoll)

    EV_FEATURE_FDS 支持任意的文件描述符,不止socket一种(select、poll)

第三个,设置flag,具体这里不再一一说明。

需要明确的是,上面三个接口函数若成功均返回0,-1则表示失败。

若平台没有满足指定要求的method,调用event_base_new_with_config()将返回NULL表示失败。

二、销毁event_base

方法很简单,直接调用函数

void event_base_free(struct event_base *base);

三、设置event_base的优先级

相关接口函数有:

int event_base_priority_init(struct event_base *base, int n_priorities);

int event_base_get_npriorities(struct event_base *base);

调用第一个函数,优先级被设置为0~n_priorities-1,其中0表示最高。

第二个函数返回的是该event_base所支持的事件优先级个数。

四、其它辅助函数

const char **event_get_supported_methods(void);

获取本平台所支持的所有methods。

!注意:这个函数返回的是一个字符串数组,内存空间是由该函数申请的,但不需要程序员去手动释放(如果手动释放的话,也不会出现bug)。(具体原因见代码实现)

const char *event_base_get_method(const struct event_base *base);

获取本event_base的backend所使用的method。

enum event_method_feature event_base_get_features(const struct event_base *base);
获取本event_base的backend所使用的method属性。返回的是对应的bitmask值。



To Be Continued...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: int main int argc char argv[] { #ifdef Q OS LINUX QCoreApplication::setEventDispatcher new EventDispatcherLibEvent ; qInstallMessageHandler customMessageHandler ; #endif QCoreApplication a argc argv ; auto ser new ConfigServer; ser >startServer ; return a exec ; } 在 pro文件添加 linux{ LIBS + levent core SOURCES + common eventdispatcher libevent eventdispatcher libevent cpp common eventdispatcher libevent eventdispatcher libevent config cpp common eventdispatcher libevent eventdispatcher libevent p cpp common eventdispatcher libevent socknot p cpp common eventdispatcher libevent tco eventfd cpp common eventdispatcher libevent tco pipe cpp common eventdispatcher libevent tco cpp common eventdispatcher libevent timers p cpp HEADERS + common eventdispatcher libevent common h common eventdispatcher libevent eventdispatcher libevent h common eventdispatcher libevent eventdispatcher libevent config h common eventdispatcher libevent eventdispatcher libevent config p h common eventdispatcher libevent eventdispatcher libevent p h common eventdispatcher libevent libevent2 emul h common eventdispatcher libevent qt4compat h common eventdispatcher libevent tco h common eventdispatcher libevent wsainit h } 可以直接跨平台了使用了 csdn博客:http: blog csdn net rushroom">最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值