Libevent API

===============================

evtimer_new

evtimer_new(base, callback, NULL)

用来做定时器,即当达到一定时间后调用回调函数callback。用evtimer_add激活定时器。

比如:

my_node->ev_expect_ping = evtimer_new(my_node->base,expected_leader_ping_period,
(void*)my_node);
evtimer_del(my_node->ev_expect_ping);
evtimer_add(my_node->ev_expect_ping,&my_node->config.expect_ping_timeval);

我们在my->base上创建了一个定时器my_node->ev_expect_ping,并绑定这个定时器上的定时事件expected_leader_ping_period。然后先用evtimer_del禁用这个定时器。再用evtimer_add启用定时器,设定expect_ping_timeval后触发。

===============================

bufferevent



struct bufferevent {
struct event_base *ev_base;
const struct bufferevent_ops *be_ops;
struct event ev_read;
struct event ev_write;
struct evbuffer *input;
struct evbuffer *output;
……
bufferevent_data_cb readcb;
bufferevent_data_cb writecb;
bufferevent_event_cb errorcb;
……
}

bufferevent 内置了两个event(读/写)和相应的缓冲区,当有数据被读入(input)时,readcb被调用,当output被输出完毕的时候,writecb被调用。

当网络I/O出现错误,如链接中断。超时或其它错误时。errorcb被调用,比如 :BEV_EVENT_ERROR

假设bufferevent出现这个事件,表示操作时错误发生。假设你是将bufferevent用作socket通信。这个错误一般意味着socket连接断开。

很多其它的错误信息须要调用EVUTIL_SOCKET_ERROR()。

bufferevent由一个底层的传输port(如套接字)。一个读取缓冲区和一个写入缓冲区组成。与通常的事件在底层传输port已经就绪,能够读取或者写入的时候运行回调不同的是,bufferevent在读取或者写入了足够量的数据之后调用用户提供的回调。

bufferevent_write(struct bufferevent *bufev, const void *data, size_t size)

把数据写入一个bufferevent buffer中,它被用来将数据写入文件描写叙述符。当数据变得可以写时,会自己主动写入到描写叙述符中。

 struct bufferevent * bufferevent_socket_new (struct event_base *base,
evutil_socket_t fd, int options)

bufferevent_socket_new在一个已经存在的socket(fd)上创建一个新的socket bufferevent,bufferevent是在event和evbuffer之上的一层封装。为输入和输出各提供了一个event(各自是ev_read和ev_write)和对应的buffer。

   void bufferevent_setcb (struct bufferevent *bufev, bufferevent_data_cb
readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb,
void *cbarg)

bufferevent_setcb()函数改动bufferevent的一个或者多个回调。readcb、writecb和eventcb函数将分别在已经读取足够的数据、已经写入足够的数据,或者错误发生时被调用。

每一个回调函数的第一个參数都是发生了事件的bufferevent,最后一个參数都是调用bufferevent_setcb()时用户提供的cbarg參数:能够通过它向回调传递数据。

int bufferevent_enable (struct bufferevent *bufev, short event)

当bufferevent初始化后,调用bufferevent_enable来激活。參数event指定bufferevent能够进行的事件,如,假设是EV_READ,则进行读。

===============================

evconnlistener_new_bind & evconnlistener_new

用evconnlistener_new_bind就可以完毕一个服务端socket的创建。

struct evconnlistener *evconnlistener_new_bind(struct event_base *base,
evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,
const struct sockaddr *sa, int socklen);

分配和返回一个新的连接监听器对象,base參数是监听器用于监听连接的event_base。即连接监听器使用event_base来得知什么时候在给定的监听套接字const struct sockaddr *sa(包括ip和port)上有新的TCP连接,新连接到达时。监听器调用你给出的回调函数cb。

struct evconnlistener *evconnlistener_new(struct event_base *base,

    evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,

    evutil_socket_t fd);

上面的两个Evconnlistener_new*() 函数都分配并返回一个新的连接监听器对象。

连接侦听器使用event_base获得通知。当在一个监听套接字上有一个新的TCP连接。当一个新的连接到达时。它将调用你所提供的回调函数。

在这两个函数中,侦听器使用一个event_base类型的base參数去侦听连接。当一个新连接被接受时。回调函数Cb将被调用;若回调cb是 NULL,监听器将被视为禁用直到设置回调。Ptr指针将传递给回调。Flags參数控制侦听器的行为。backlog參数控制着挂起连接的最大的数目,即不论什么时间网络堆栈应该同意等待中尚未接受的状态的数目。假设backlog是负的,Libevent
将尝试为backlog设置一个适当的值。假设它是零,Libevent 将假定您已经在套接字上调用 listen()。

这两个函数设置监听套接字的方式不同。Evconnlistener_new() 函数如果您已有套接字已经与port绑定,而且以fd參数传递。如果您希望自己让Libevent 分配和绑定到套接字上,调用 evconnlistener_new_bind(),传递sockaddr參数的和它的长度。

要释放连接的侦听器。请将它传递给 evconnlistener_free()。

===============================

evbuffer_remove



int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen);

evbuffer_remove() 函数将复制和删除前面的buf的datlen个字节到内存中的data中。假设少于datlen个字节可用,函数将复制全部的字节。

失败返回的值是-1。否则返回复制的字节数。

演示样例:

 struct evbuffer* evb = bufferevent_get_input(bev);
evbuffer_remove(evb,msg_buf,SYS_MSG_HEADER_SIZE+data_size);

从一个bufferevent叫bev中读取数据到evbuffer evb中。再转到msg_buf中。



libevent入门的更多相关文章

  1. libevent入门教程

    首先给出官方文档吧: http://libevent.org ,首页有个Programming with Libevent,里面是一节一节的介绍libevent,但是感觉信息量太大了,而且还是英文的- ...

  2. libevent入门(1)

    libevent是什么                libevent 库实际上没有更换 select().poll() 或其他机制的基础.而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包 ...

  3. libevent入门介绍

    libevent是之前看到的一个别人推荐的清凉级网络库,我就想了解一下它.今天下载到了一个人写的剖析系列,从结构和源码方面进行了简要分析.只是这个分析文章是2010年的,有点过时了(跟现在的libev ...

  4. [z]libevent入门教程:Echo Server based on libevent 不指定

    [z]https://www.felix021.com/blog/read.php?2068 花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明, ...

  5. libevent 入门教程:Echo Server based on libevent(转)

    下面假定已经学习过基本的socket编程(socket, bind, listen, accept, connect, recv, send, close),并且对异步/callback有基本的认识. ...

  6. 【VS开发】【数据库开发】libevent入门

    花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明,让人马上就能上手用的.首先给出官方文档吧: http://libevent.org ,首页有个 ...

  7. [原]我在Windows环境下的首个Libevent测试实例

    libevent对Windows环境也有很好的支持,不过初次学习和编译libevent简单实例,总是有一些陌生感的,只有成功编译并测试了一个实例,才会有恍然大悟的感觉.下面将要讲到的一个实例是我从网上 ...

  8. 轻量级网络库libevent初探

    本文是关于libevent库第一篇博文,主要由例子来说明如何利用该库.后续博文再深入研究该库原理. libevent库简介 就如libevent官网上所写的“libevent - an event n ...

  9. C++日志操作开源函数库之Google-glog

    今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...

随机推荐

  1. php install extension

    wget http://nginx.org/download/nginx-1.8.0.tar.gz wget http://nginx.org/download/nginx-1.8.0.tar.gz ...

  2. linux使用wget纯命令下载JDK的方法(凑字数)

    linux使用wget纯命令下载JDK的方法 linux使用wget纯命令下载JDK的方法 Oracle官网上下载jdk,需要点击accept licence的才能下载,所以一般的直接使用wget下载 ...

  3. Spring起步(一)Building a RESTful Web Service

    http://spring.io/guides/gs/rest-service/ 先放链接. 这个很小很小的一个功课,我却遇到了各种各样的奇葩错误,折腾了两天才弄好. 想要开始的话,需要一些准备工具 ...

  4. Mysql mysqlimport 导入数据

    在mysql 数据库中可以用 mysqlimport 工具来实现数据的导入!mysqlimport 导入数据简单,但是这个也要满足一定的条件 1.既然是把数据导入到数据库,你总有一个数据库用户账号吧 ...

  5. JAVA中正則表達式总结

    昨天,我的朋友请教我正則表達式.我也好久没有写过正則表達式了,昨天刚好看了下如鹏网创始人杨中科老师关于正則表達式的解说.使我加深了正則表達式的印像.现我把他总结下: 很多语言,包含Perl.PHP.P ...

  6. JS年月日三级联动下拉框日期选择代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Jquery的一些简单使用记录

    //平滑滚动到底部 $(".list").scrollTo('100%', '100%', { easing: 'swing' }); //直接滚动至底部(无效果) $('.lis ...

  8. Robolectric 探索之路

    layout: post title: Roboletric探索之路,从抗拒到依赖 description: Roboletric Android Unit Testing category: blo ...

  9. Hibernate与iBATIS的比较

    1.出身 hibernate 是当前最流行的o/r mapping框架,它出身于sf.net,现在已经成为jboss的一部分了. ibatis 是另外一种优秀的o/r mapping框架,目前属于ap ...

  10. (转)Log4J日志配置详解

    http://www.cnblogs.com/ITtangtang/p/3926665.html 一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源 ...