基于Reactor模式的libevent网络库之浅析与使用
来源:互联网 发布:编程语言能用中文 编辑:程序博客网 时间:2024/05/21 21:48
Libevent特点:
- 跨平台支持。支持linux,unix,和windows.
- 统一事件源:对I/O事件,信号和定时事件提供统一的处理。
- 线程安全。使用libevent_pthreads库来提供线程安全支持。
- 基于Reactor模式的实现。
Reactor事件处理机制:
Reactor是一种事件驱动机制,有一个或多个并发的输入源(事件),有一个service handler, 有多个event handler. 具体过程就是应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口(回调函数)。
感性认识如下:
Reactor模式框架
基于Reactor模式的IO框架一般包含如下几个组件:
- 句柄(事件源):IO框架库要处理的对象,即IO事件,信号和定时事件。句柄的作用是,当内核检测到就绪事件时,它通过句柄来通知应用程序这一事件。Linux下IO事件对应文件描述符,信号事件则为相应的信号值。
- 事件多路分发器:由操作系统提供的I/O多路复用机制,如select和epoll。程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上,当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集上,有一个或多个句柄的时事件已经就绪”,程序收到通知后,可以在非阻塞的情况下对事件进行处理。libevent使用结构体eventop对IO复用select,poll,epoll等进行封装,以统一接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。
- Reactor:事件管理的接口,内部使用event demultiplexer注册,注销事件,并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。对于libevent的event_base结构体。
- Event Handler :对应于libevent的event结构体。提供了一组接口,每个接口对应一种类型事件,供Reactor在相应事件发生时调用,执行相应的事件处理。
使用libevent实例
#include <sys/signal.h>#include <event2/event.h>void signal_cb(int fd,short event,void *arg){ //do something}void event_cb(int fd,short event,void *arg){ //do something}int main(){ struct event_base* base=event_new(); struct event* signal_event=evsignal_new(base,SIGINT,signal_cb,base);//信号 struct event* IO_event=event_new(base,fd,EV_READ,event_cb,base);//I/O事件 event_add(signal_event,NULL); event_add(IO_event,NULL); event_base_dispatch(base); event_free(signal_event); event_free(IO_event); event_base_free(base);}
步骤总结如下:
- 调用event_new() 初始化一个event_base实例(Reactor)
- 初始化事件event,设置回调函数和关注的事件。
- 调用event_add()注册关注的事件
- 程序调用event_base_dispatch()进入event_loop.
注册事件后,libevent内部的时间处理流程:
阅读全文
0 0
- 基于Reactor模式的libevent网络库之浅析与使用
- libevent之Reactor模式详解
- 发布一个基于 Reactor 模式的 C++ 网络库
- 发布一个基于 Reactor 模式的 C++ 网络库
- 发布一个基于 Reactor 模式的 C++ 网络库
- 发布一个基于 Reactor 模式的 C++ 网络库
- 一个基于 Reactor 模式的 C++ 网络库
- 发布一个基于 Reactor 模式的 C++ 网络库
- libevent高性能网络库源码分析——Reactor模式(二)
- 网络编程之Reactor 模式
- libevent之reactor
- libevent和基于libevent的网络编程
- 网络编程:Reactor与Proactor的概念(设计模式)
- [libevent]Reactor反应器设计模式
- Memcached源码分析之基于Libevent的网络模型
- 3.6 网络编程与reactor模式
- libevent学习之跨平台Reactor接口的实现
- NIO+reactor模式的网络服务器设计方案
- Android 视频直播 ( 从快播到直播,从高清到无码 )十年视频开发项目
- 处理滑动冲突:外部拦截标准模板
- Python 3从入门到精通7-函数和类
- [NOIP模拟][动态规划]随机图
- dataTables-使用详细说明整理
- 基于Reactor模式的libevent网络库之浅析与使用
- 顶层const与底层const
- List<Map<String,Object>>集合根据map里面的一个字段排序
- [转]pycharm的一些快捷键
- HashSet容器
- BZOJ 2463 谁能赢呢?[博弈论]
- Javascript 脚本语言详解
- 启动hadoop时,datanode启动不起来的问题
- java常用2种for循环的区别