- 浏览: 718690 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1042)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (52)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (33)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
void
event_set(struct event *ev, evutil_socket_t fd, short events,
void (*callback)(evutil_socket_t, short, void *), void *arg)
相当于一个初始化结构体,其中的参数evutil_socket_t fd,short events,和一个void *arg将发送给callback作为它的参数
原文出自:http://lwg2001s.iteye.com/blog/289833,写的很不错,言简意赅
libevent 是一个强大的跨平台的事件通知库,如果不想被多线程困扰,可以考虑这个平台,它从1.2.* 版本开始支持轻量级的http server 开发支持,随后陆续还推出轻量级 DNS server、RPC server 开发支持
LIBEVENT的功能:
这组事件API提供了一种当某个指定文件描述符有效或时间到达时执行某个函数的机制.
在使用事件API前必须使用event_init()初始化.
In order to process events, an application needs to call
为了能够处理事件,应用程序必须调用event_dispatch(),该函数只当错误时返回,这时应该由用应程序接管事件.
函数event_set()
(原型
event_set(struct event *ev, int fd, short event,
void (*fn)(int, short, void *), void *arg);
)
用于生成事件结构体ev,以备event_add()和event_del()使用.事件驱动程序将会调用void (*fn)(int, short, void *)中fn指定的函数,并传递三个参数int:文件描述符,short:事件类型,void*:其它参数由arg参数指定.
int fd 指定要监视的文件描述符,
short event 可以是EV_READ,EV_WRITE或EV_READ|EV_WRITE表示该文件可以无阻塞地进行读写.
fn函数将会被调用,并传递给三个变量:
int fd:触发事件的文件描述符.
short event:触发事件的类型EV_TIMEOUT,EV_SIGNAL, EV_READ, or EV_WRITE.
void* :由arg参数指定的变量.
另外重复注册的事件将会产生重复的事件通知.EV_PERSIST可以让注册的事件在执行完后不被删除,直到调用event_del()删除.
结构体初始化完成后,在无需改变内容的情况下,可以被event_add(),event_del()重复使用.但是当结构体被event_add()添加之后,必须保持结构体的内容,直到事件被执行后退出或调用event_del()删除该事件.不允许将这个结构体变量注册完事件后重复使用.每一个描述符都需要一个单独的event结构体变量.
event_add()函数使通过event_set()设置的事件在事件匹配或超时时(如果设置了超时)被执行.
event结构体变量必须先用event_set()初始化过,并且在事件被删除前不得再次调用event_set()来初始化之.如果事件发生超时,旧的超时时间会被新的超时时间所取代.
event_del()函数会取消event结构体所指定的事件,如果该事件已经执行或没有注册(在事件链表中不存在),该函数不会产生任何作用.
evtimer_set(), evtimer_add(), evtimer_del(),evtimer_initialized() evtimer_pending()等函数()用于设置定时或超时操作.在这些函数中,文件描述符为-1,事件类型为EV_TIMEOUT.
signal_set(), signal_add(), signal_del(),signal_initialized(),signal_pending()等函数从略,其中事件类型为EV_SIGNAL.那就意味着signal_set() 添加了EV_PERSIST.
为了避免信号竞争,事件API提供了两程变量:event_sigcb 和 event_gotsig.某个信号的句柄设置event_gotsig表示收到信号.应用程序把event_sigcb设置成一个回调函数.当信号句柄设置了
event_gotsig之后,event_dispatch函数会执行回调函数处理接收到的信号.当没有事件注册时回调函数返回1.回调函数可以返回-1表示错误,这将导致event_dispatch()结束,错误代码为EINTR.
函数跟相似,但是它只调用回调函数一次,并且不需要调用者准备event结构体变量.该函数支持EV_TIMEOUT,EV_READ, andEV_WRITE.
event_pending()用于检测event结构体变量指定的事件是否处于等待状态.如果设定了EV_TIMEOUT,并且tv结构体指针变量非空,则事件终止时间由tv返回.
event_initialized()用于检测event结构体变量是否已经初始化.
event_loop提供一个接口用于单向执行等待事件.EVLOOP_ONCE和 EVLOOP_NONBLOCK有效.调用event_loopexit函数从事件循环中退出.在结定时间超时后下一个event_loop()重复将会正常完成然后不再等待事件直接退出.之后的event_loop()调用将会被正常执行.调用event_loopbreak函数直接从事件循环中退出. 下一个事件完成后event_loop()会中止退出.event_loopbreak()典型的是被事件回调函数调用,这个特性类似于执行了break;语句.之后的event_loop()调用会正常进生
初始化event结构体变量中的回调函数是程序调用者必须提供的.
事件优先级
默认情况下,libevent以相同的优先级调度法动的事件.但是有时候希望以较其它事件更高的优先级处理某些事件.正因为如此,libevent支持精确的优先级队列.优先级值较低活动事件总是比优先级值较高的活动事件.
不同的优先级别可以使用event_priority_init()函数来初始化.该函数必须在之前调用.event_priority_set()函数用于设置事件的优先级.默认情况下libevent把所有事件的优先级设置成中间值,除非它们的优先级被明确指定.
线程安全事件
Libevent支持线程安全,当初始化事件库时调用event_init(),返回一个事件根基event base.这个事件根基可以被event_base_set(),event_base_dispatch(), event_base_loop(), event_base_loopexit(),bufferevent_base_set() andevent_base_free().等函数共同使用.
event_base_set()应该在event_set()初始化之后调用,因为函数event_set()对最近创建的事件根基赋值.在调用bufferevent_new()初始化缓存事件之后应该调用bufferevent_base_set().当不再需要事件根基时应该调用函数释放内存.
缓存事件
libevent 提供正常事件回调的一个抽象.这个抽象叫缓存事件.缓存事件提供输入输出缓存自动写入和读出.使用缓存事件的程序员不再需要直接处理IO,而是通过读写输入输出缓存.
bufferevent_new()使用创建新的缓存事件.
(原型:
struct bufferevent *
bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb, everrorcb,
void *cbarg);
)
int fd:要读写数据的文件描述符.访文件描述符不允许是管道
接下来三个参数是回调:读写回调函数原型void (*cb)(struct bufferevent *bufev, void *arg)
错误处理回调函数原型:void (*cb)(struct bufferevent *bufev, short what, void *arg)
其中arg参数由cbarg指定.读写回调函数可以是NULL,错误处理回调函数必须指定.
一旦初始化,缓存事件结构体可以被bufferevent_enable(),bufferevent_disable()重复使用.标志参数可以是EV_READ和EV_WRITE.当文件可读时缓存试图从文件描述符中读取数据然后调用回调函数.当缓存中的数据少于写的最低"水位线"时,写回调函数被调用.该最低"水位线"默认为0.
bufferevent_write()用于往文件中写入数据.该数据被自动释放到输出缓冲区,当文件可写时写入文件描述符.该函数成功返回0,失败返回-1.
bufferevent_read()用于读取输入缓冲区中的数据,返回读取的字节数.
如果使用多个事件根基,bufferevent_base_set()函数必须在延缓一次使能缓存事件时调用.
无阻塞HTTP支持
libevent支持所有轻量级的HTTP层,可以且来作HTTP服务器也可以用来发HTTP请求.
HTTP服务器可以使用来创建calling evhttp_new().
也可以用evhttp_bind_socket()绑定所有端口和地址.当HTTP服务器不再使用时,可以调用evhttp_free()释放.
要收到HTTP请求,用户应该注册一个HTTP服务器回调,可以用 evhttp_set_cb()来实现.该函数的第二个参数是回调函数注册的URI.相应的回调会收到一个evhttp_request的结构体对象,它包含请求的所有信息.
这里不有将所有函数调用一一介绍,请参考event.h查看API接口.
event_set(struct event *ev, evutil_socket_t fd, short events,
void (*callback)(evutil_socket_t, short, void *), void *arg)
相当于一个初始化结构体,其中的参数evutil_socket_t fd,short events,和一个void *arg将发送给callback作为它的参数
原文出自:http://lwg2001s.iteye.com/blog/289833,写的很不错,言简意赅
libevent 是一个强大的跨平台的事件通知库,如果不想被多线程困扰,可以考虑这个平台,它从1.2.* 版本开始支持轻量级的http server 开发支持,随后陆续还推出轻量级 DNS server、RPC server 开发支持
LIBEVENT的功能:
这组事件API提供了一种当某个指定文件描述符有效或时间到达时执行某个函数的机制.
在使用事件API前必须使用event_init()初始化.
In order to process events, an application needs to call
为了能够处理事件,应用程序必须调用event_dispatch(),该函数只当错误时返回,这时应该由用应程序接管事件.
函数event_set()
(原型
event_set(struct event *ev, int fd, short event,
void (*fn)(int, short, void *), void *arg);
)
用于生成事件结构体ev,以备event_add()和event_del()使用.事件驱动程序将会调用void (*fn)(int, short, void *)中fn指定的函数,并传递三个参数int:文件描述符,short:事件类型,void*:其它参数由arg参数指定.
int fd 指定要监视的文件描述符,
short event 可以是EV_READ,EV_WRITE或EV_READ|EV_WRITE表示该文件可以无阻塞地进行读写.
fn函数将会被调用,并传递给三个变量:
int fd:触发事件的文件描述符.
short event:触发事件的类型EV_TIMEOUT,EV_SIGNAL, EV_READ, or EV_WRITE.
void* :由arg参数指定的变量.
另外重复注册的事件将会产生重复的事件通知.EV_PERSIST可以让注册的事件在执行完后不被删除,直到调用event_del()删除.
结构体初始化完成后,在无需改变内容的情况下,可以被event_add(),event_del()重复使用.但是当结构体被event_add()添加之后,必须保持结构体的内容,直到事件被执行后退出或调用event_del()删除该事件.不允许将这个结构体变量注册完事件后重复使用.每一个描述符都需要一个单独的event结构体变量.
event_add()函数使通过event_set()设置的事件在事件匹配或超时时(如果设置了超时)被执行.
event结构体变量必须先用event_set()初始化过,并且在事件被删除前不得再次调用event_set()来初始化之.如果事件发生超时,旧的超时时间会被新的超时时间所取代.
event_del()函数会取消event结构体所指定的事件,如果该事件已经执行或没有注册(在事件链表中不存在),该函数不会产生任何作用.
evtimer_set(), evtimer_add(), evtimer_del(),evtimer_initialized() evtimer_pending()等函数()用于设置定时或超时操作.在这些函数中,文件描述符为-1,事件类型为EV_TIMEOUT.
signal_set(), signal_add(), signal_del(),signal_initialized(),signal_pending()等函数从略,其中事件类型为EV_SIGNAL.那就意味着signal_set() 添加了EV_PERSIST.
为了避免信号竞争,事件API提供了两程变量:event_sigcb 和 event_gotsig.某个信号的句柄设置event_gotsig表示收到信号.应用程序把event_sigcb设置成一个回调函数.当信号句柄设置了
event_gotsig之后,event_dispatch函数会执行回调函数处理接收到的信号.当没有事件注册时回调函数返回1.回调函数可以返回-1表示错误,这将导致event_dispatch()结束,错误代码为EINTR.
函数跟相似,但是它只调用回调函数一次,并且不需要调用者准备event结构体变量.该函数支持EV_TIMEOUT,EV_READ, andEV_WRITE.
event_pending()用于检测event结构体变量指定的事件是否处于等待状态.如果设定了EV_TIMEOUT,并且tv结构体指针变量非空,则事件终止时间由tv返回.
event_initialized()用于检测event结构体变量是否已经初始化.
event_loop提供一个接口用于单向执行等待事件.EVLOOP_ONCE和 EVLOOP_NONBLOCK有效.调用event_loopexit函数从事件循环中退出.在结定时间超时后下一个event_loop()重复将会正常完成然后不再等待事件直接退出.之后的event_loop()调用将会被正常执行.调用event_loopbreak函数直接从事件循环中退出. 下一个事件完成后event_loop()会中止退出.event_loopbreak()典型的是被事件回调函数调用,这个特性类似于执行了break;语句.之后的event_loop()调用会正常进生
初始化event结构体变量中的回调函数是程序调用者必须提供的.
事件优先级
默认情况下,libevent以相同的优先级调度法动的事件.但是有时候希望以较其它事件更高的优先级处理某些事件.正因为如此,libevent支持精确的优先级队列.优先级值较低活动事件总是比优先级值较高的活动事件.
不同的优先级别可以使用event_priority_init()函数来初始化.该函数必须在之前调用.event_priority_set()函数用于设置事件的优先级.默认情况下libevent把所有事件的优先级设置成中间值,除非它们的优先级被明确指定.
线程安全事件
Libevent支持线程安全,当初始化事件库时调用event_init(),返回一个事件根基event base.这个事件根基可以被event_base_set(),event_base_dispatch(), event_base_loop(), event_base_loopexit(),bufferevent_base_set() andevent_base_free().等函数共同使用.
event_base_set()应该在event_set()初始化之后调用,因为函数event_set()对最近创建的事件根基赋值.在调用bufferevent_new()初始化缓存事件之后应该调用bufferevent_base_set().当不再需要事件根基时应该调用函数释放内存.
缓存事件
libevent 提供正常事件回调的一个抽象.这个抽象叫缓存事件.缓存事件提供输入输出缓存自动写入和读出.使用缓存事件的程序员不再需要直接处理IO,而是通过读写输入输出缓存.
bufferevent_new()使用创建新的缓存事件.
(原型:
struct bufferevent *
bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb, everrorcb,
void *cbarg);
)
int fd:要读写数据的文件描述符.访文件描述符不允许是管道
接下来三个参数是回调:读写回调函数原型void (*cb)(struct bufferevent *bufev, void *arg)
错误处理回调函数原型:void (*cb)(struct bufferevent *bufev, short what, void *arg)
其中arg参数由cbarg指定.读写回调函数可以是NULL,错误处理回调函数必须指定.
一旦初始化,缓存事件结构体可以被bufferevent_enable(),bufferevent_disable()重复使用.标志参数可以是EV_READ和EV_WRITE.当文件可读时缓存试图从文件描述符中读取数据然后调用回调函数.当缓存中的数据少于写的最低"水位线"时,写回调函数被调用.该最低"水位线"默认为0.
bufferevent_write()用于往文件中写入数据.该数据被自动释放到输出缓冲区,当文件可写时写入文件描述符.该函数成功返回0,失败返回-1.
bufferevent_read()用于读取输入缓冲区中的数据,返回读取的字节数.
如果使用多个事件根基,bufferevent_base_set()函数必须在延缓一次使能缓存事件时调用.
无阻塞HTTP支持
libevent支持所有轻量级的HTTP层,可以且来作HTTP服务器也可以用来发HTTP请求.
HTTP服务器可以使用来创建calling evhttp_new().
也可以用evhttp_bind_socket()绑定所有端口和地址.当HTTP服务器不再使用时,可以调用evhttp_free()释放.
要收到HTTP请求,用户应该注册一个HTTP服务器回调,可以用 evhttp_set_cb()来实现.该函数的第二个参数是回调函数注册的URI.相应的回调会收到一个evhttp_request的结构体对象,它包含请求的所有信息.
这里不有将所有函数调用一一介绍,请参考event.h查看API接口.
发表评论
-
柔性数组
2017-09-20 09:53 444#include <iostream> #i ... -
rawsocket发送icmp包
2017-09-06 09:54 615#include <stdio.h> #in ... -
查看glibc版本
2016-12-07 14:13 492strings /lib64/libc.so.6 |grep ... -
trim
2015-05-14 14:45 320/* trim from start */ ... -
log
2015-03-30 17:42 410log.h #ifndef __LOG_H__ #def ... -
输出类名
2014-02-20 21:51 539#include <iostream> us ... -
GC的改良
2013-10-17 22:05 529分代回收:对分配不久,诞生时间较短的“年龄”对象进行重点扫描, ... -
GC与引用记数
2013-10-16 21:57 664根(Root)就是判断对象是否可被引用的起始点。至于哪里才是根 ... -
pthread
2013-07-09 10:10 551#include <pthread.h> # ... -
const
2012-10-08 23:57 1115#include<iostream> usi ... -
声明与定义
2012-10-04 11:33 659extern int i;//声明但未定义 int j;//声 ... -
windows下iconv转码
2012-08-28 17:07 2809http://ah-fu.iteye.com/blog/281 ... -
在windows下使用pthread
2012-08-28 10:12 754http://hi.baidu.com/yylwuwei/bl ... -
消除编译器未使用的警告
2012-03-29 15:07 1060#define XXX_UNUSED(x) (void)x; ... -
消息队列
2012-03-27 16:56 1366msgget函数用于创建一个新的消息队列或访问一个已存在的消息 ... -
静态链接库
2012-03-16 16:54 659静态库是obj文件的一个集合,通常以.a为后缀,理论上执行速度 ... -
#if0
2012-03-07 13:45 1212#if 0 #endif 用于屏蔽注释中间的代码,避免注释嵌 ... -
枚举转char
2012-03-05 11:54 949#define NAME(value) #value -
c++0x
2012-02-01 09:55 727http://blog.csdn.net/pongba/art ... -
使用动态链接库
2011-11-02 16:36 9351.先创建一个动态链接库的工程 vs下,file->ne ...
相关推荐
对学习和使用libevent很有帮助。很多网络框架底层的基础,理解有助于了解上层框架的构成。在游戏开发方向也有很多服务器架构作为必不可少的一部分。都是基于此做的网络库的封装。
该资源为libevent库源码,2.1.8stable,用于编译libevent相关库文件,编译过程及使用库创建http https server可参照本账号博客文章。
离线环境下,通过二进制安装memcached程序时,需要安装libevent-2.0.20-stable依赖,报错时会提示安装libevent相关依赖。
libevent库的安装(linux和windows)相关和测试代码libevent_test.cpp
似乎官方对C++sdk不太重视,可能和rocketMQ 的关注度低有关。在这里把自己编译好的动态库放上来供使用者直接下载。还有相关依赖库也附上。 libevent-release-2.0.22 编译环境 vs2015 x64 release
Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。作者写这一系列文章的用意在于,一则分享心得;二则对libevent代码和设计思想做系统的、更深层次的分析,写出来,也可供后来者...
本人亲自试验整理,真实有效,包括nginx、apache、JDK、memcahed、libevent、zlib、pcre、ssl各操作系统版本及相关插件的官方下载地址,地址长久有效且版本永远有最新!心血整理,一次下载永久省心,建议好好保存以...
最近再学习Libevent由于自己使用的是windows系统,遗憾的是有关在vs下可以参考的程序少之又少。在参考了许多的博客文章后。自己摸索写了一个简单的Libevent Server程序。并且在网上找了一个简单的客户端程序,测试该...
libevent_webservice 基于libevent( )的简单异步多线程Web服务请转到webservice目录,以获取有关如何安装,构建和执行此webservice的说明。
evhttp-http-proxy 通过 libevent 实现的 HTTP 代理请注意,需要 libevent-streaming,即 libevent 的扩展。 您可以忽略“pcmm”相关代码。
详细介绍了libevent内部框架,处理机制等,及相关的源码剖析。
├── buffer.c // buffer * .c 缓冲区相关函数 ├── buffer_iocp.c ├── bufferevent-internal.h ├── bufferevent.c ├── bufferevent_async.c ├── bufferevent_filter.c ├── bufferevent_mbedtls...
liunx 服务器安装memcache缓存框架所需要的相关包 其中libevent-memcache.tar 包含了libevent-release-1.4.15-stable.tar和memcached-1.5.1.tar两个tar包
安装snort必备,具体安装请参考相关网络资源,欢迎下载
linux版本libevent-2.1.8-stable.tar.gz和memcached-1.4.19.tar.gz libevent和memcached两个安装包...java_memcached-release_2.6.6相关jar包 MemcachedUtils封装java调用工具类 以上内容亲测可用,在CentOS上安装成功
本文档描述了有关使用 evhtp API 的详细信息。 这个文档可能不是很厉害,最好看test.c看看高级用法。 所需的依赖项 可选依赖 线程 建造 光盘构建 .. 制作 举例 概述 Libevhtp 是作为 Libevent 当前 HTTP API 的...
--config Release # Or "start libevent.sln" and build with menu in Visual Studio. 有关更多信息,请参见 。 CMake(Unix) $ mkdir build && cd build $ cmake .. # Default to Unix Makefiles. $ make $ make...
相关的配置文件也未采用icomet作者的命名方式。 使用的第三方库包括:libevent 2.0.22版本: ://libevent.org/ pthread-win: : 开发工具采用vs2013,需要在项目中设置头文件以及库文件的路径。
安装memcached所需要的相关软件libevent-2.0.22-stable.tar.gz/memcached-1.4.32.tar.gz