libevent入门
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入门的更多相关文章
- libevent入门教程
首先给出官方文档吧: http://libevent.org ,首页有个Programming with Libevent,里面是一节一节的介绍libevent,但是感觉信息量太大了,而且还是英文的- ...
- libevent入门(1)
libevent是什么 libevent 库实际上没有更换 select().poll() 或其他机制的基础.而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包 ...
- libevent入门介绍
libevent是之前看到的一个别人推荐的清凉级网络库,我就想了解一下它.今天下载到了一个人写的剖析系列,从结构和源码方面进行了简要分析.只是这个分析文章是2010年的,有点过时了(跟现在的libev ...
- [z]libevent入门教程:Echo Server based on libevent 不指定
[z]https://www.felix021.com/blog/read.php?2068 花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明, ...
- libevent 入门教程:Echo Server based on libevent(转)
下面假定已经学习过基本的socket编程(socket, bind, listen, accept, connect, recv, send, close),并且对异步/callback有基本的认识. ...
- 【VS开发】【数据库开发】libevent入门
花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明,让人马上就能上手用的.首先给出官方文档吧: http://libevent.org ,首页有个 ...
- [原]我在Windows环境下的首个Libevent测试实例
libevent对Windows环境也有很好的支持,不过初次学习和编译libevent简单实例,总是有一些陌生感的,只有成功编译并测试了一个实例,才会有恍然大悟的感觉.下面将要讲到的一个实例是我从网上 ...
- 轻量级网络库libevent初探
本文是关于libevent库第一篇博文,主要由例子来说明如何利用该库.后续博文再深入研究该库原理. libevent库简介 就如libevent官网上所写的“libevent - an event n ...
- C++日志操作开源函数库之Google-glog
今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...
随机推荐
- 关于Connection must be valid and open.
这个Bug真心很操蛋! 我的网站在公司做的运行一切都没问题,回家后咋自己的电脑上出现了Connection must be valid and open.这个问题. 我最后还是在英文网站的一个不起眼的 ...
- JSWING小工具
项目中需要一个发送指令到指定服务端,取得设备ID及检测数据的小工具,就利用jswing开发了一个简单小组件,最终效果如下: 代码很简单,具体片段如下: Window.java import java. ...
- 测试linux和window下 jdk最大能使用多大内存
在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息. 发现在linux先 最多用java ...
- WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起
WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTM ...
- Uva 1612 Guess
Thinking about it: 题目要求最后一名(也就是第N位)的分数要尽量的大,那么就一定要求第N-1名的分数也要尽量大.假如N-1可以取400和500,那么N-1应该取500,如果取400, ...
- java 执行bat文件 并输出信息
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...
- iOS 按钮倒计时功能
iOS 按钮倒计时功能, 建议把按钮换成label,这样会避免读秒时闪烁 __block ; __block UIButton *verifybutton = _GetverificationBtn; ...
- LuCI探究(转)
原文链接 : http://www.cnblogs.com/gnuhpc/archive/2013/08/31/3293643.html 1. 多语言 1)检查: opkg list | grep l ...
- 第三章 用 PowerShell 进行远程管理(remoting)
第三章 用 PowerShell 进行远程管理(remoting) PowerShell V2 引进了一项强大的新技术,远程(remoting),PowerShell V3 进行了完善和扩展.主要基于 ...
- 文件上传下载样式 --- bootstrap
在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框 ...