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_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。


evconnlistener_new

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 API的更多相关文章

  1. libevent API 介绍

    基本应用场景也是使用 libevnet 的基本流程,下面来考虑一个最简单的场景,使用livevent 设置定时器,应用程序只需要执行下面几个简单的步骤即可. 1)首先初始化 libevent 库,并保 ...

  2. [转]libevent简介和使用

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...

  3. libevent功能使用简介

    http://blog.csdn.net/happyanger6/article/details/7272324 1. 介绍 libevent是一个用来开发可扩展的网络服务器的事件通知函数库.当一个文 ...

  4. libevent 定时器timer

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...

  5. libevent入门

    Libevent API =============================== evtimer_new evtimer_new(base, callback, NULL) 用来做定时器,即当 ...

  6. libevent简单介绍和使用

    <pre class="html" name="code">libevent接口的使用是简单easy的.关键还是一些其他技术须要深入了解.如epol ...

  7. Libevent源码分析 (1) hello-world

    Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libeven ...

  8. libevent简介和使用【转】

    转自:http://www.open-open.com/lib/view/open1386510630330.html libevent是一个基于事件触发的网络库,memcached底层也是使用lib ...

  9. 看libevent所遇到的英语生词

    libevent – an event notification library The libevent API (libevent应用程序)provides a mechanism(机制) to ...

随机推荐

  1. Nginx 訪问日志增长暴增出现尖刀的具体分析

    前言:          Nginx日志里面Mobileweb_access.log增长特别大.一天上百兆.将近100W的訪问记录.依照我们眼下的规模,热点用户才500个左右.就算人人用手机app訪问 ...

  2. python中使用ctypes调用MinGW生成的动态链接库(dll)

    关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...

  3. 简单的RPC java实现

    RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster Worm virus)袭卷全球的一年.而“冲击波”正是用着RPC这把刀来敲开了远程电脑的大门.当然RPC 有更多正面的应用,比 ...

  4. #pragma详解

    在#Pragma是预处理指令它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有 ...

  5. 与内存有关的那些事儿(数组分配空间不够,导致缓冲区溢出,从而strcpy会出现异常)

    这日,我写下如下代码:#include <iostream>int main(void){ char *p = new char[5]; char *t = new char[5]; st ...

  6. 新的方法 (New Approach)¶

    第一章:简介 - ANSI Common Lisp 中文版 新的方法 (New Approach)¶ 本书的目标之一是不仅是教授 Lisp 语言,而是教授一种新的编程方法,这种方法因为有了 Lisp ...

  7. linux c socket 案源

    service结束 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #inclu ...

  8. 如何搭建NTP服务(转)

    最近,在搭建Oracle RAC过程中,需要用到DNS和NTP,其中,DNS用于域名.IP管理,NTP用于时间同步.其实,很久以前搭建过这两种服务,但技术,本质上,符合“用进废退”的客观规律.用得越频 ...

  9. achieve aop through xml

    The main way to achive AOP is deploying a xml file. Now a xml file is presented to be a explanation ...

  10. 基于TFTP协议的远程升级设计

    说明:因为CSDN博客编辑器对word格式近乎不支持.因此对表格使用了图片方式(最后一个表格未使用图片格式.大家能够看看效果),CSDN博客编辑器上传图片十分不人性化(直接复制图片是不显示的),因此本 ...