libevent是一个开源的事件控制机制,如果不想陷入多进程或多线程的困扰,那么libevent将是很合适的工具。

libevent提供了很多的API来管理和控制事件,可用于设计读、写、信号、定时等各种类型的事件处理,其使用主要有一下几个步骤:
    1、首先需要初始化一个event_base结构体,它是libevent的入口,形如
     struct event_base* base=event_init();
    在新版本中推荐使用线程安全的   event_base_new()来替换event_init();
     初始化后就建立了一个libevent的基本框架,接下来就是向框架里注册事件和相应的事件回调函数了。
    2、设置注册事件和回调函数:
      设置事件使用API:   event_set,原型:
event_set(struct event *ev, int fd, short event, void (*func)(int, short, void *), void *arg); 
      ev是声明的event结构体名称;
      fd是监视事件对应的文件描述符;
      short event是指定事件类型,可以是:EV_READ,EV_WRITE或EV_READ|EV_WRITE,通常配合使用EV_PERSIST,使事件在执行后不被删除,直到调用event_del()。
      *func(int, short, void *)是编写好的回调函数指针,指明在监听的事件发生时要做的处理,其中void*是有*arg指定的参数,int 和short则对应与 int fd和 short event;
    3、添加事件
      事件设置之后,调用API: 
             event_add(struct event* ev,timeout);
      ev是之前设置的event结构体指针,timeout是超时设置,没有可填NULL;
至此,对事件的初始化和设置已完成。
     4、最后一步是事件的运行
      调用:     event_base_dispatch(base);
      这是一个无线循环,还有很多的API提供各种不同需要,如:
     event_base_set(),event_base_dispatch(), event_base_loop(),  bufferevent_base_set()    等
简单的例子,libevent配合socket非常方便地完成监听多客户端的连接(部分代码):
 
int main(int argc, char* argv[])
{
     struct sockaddr_in my_addr;
     int sock;
 
     sock = socket(AF_INET, SOCK_STREAM, 0); 
     int yes = 1;
     setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
     memset(&my_addr, 0, sizeof(my_addr));
     my_addr.sin_family = AF_INET;
     my_addr.sin_port = htons(PORT);
     my_addr.sin_addr.s_addr = INADDR_ANY;
     bind(sock, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
     listen(sock, BACKLOG);
 
     struct event listen_ev;
     base = event_base_new();//初始化
     event_set(&listen_ev, sock, EV_READ|EV_PERSIST, on_accept, NULL);//设置事件
     event_base_set(base, &listen_ev);
     event_add(&listen_ev, NULL);//添加
     event_base_dispatch(base);//运行
 
     return 0;
 }
以上只是简单的使用步骤,后续还有很多其他的API和使用介绍

libevent学习的更多相关文章

  1. libevent学习之二:Windows7(Win7)下编译libevent

    Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...

  2. PHP中的Libevent学习

    wangbin@2012,1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libeven ...

  3. libevent学习笔记 一、基础知识【转】

    转自:https://blog.csdn.net/majianfei1023/article/details/46485705 欢迎转载,转载请注明原文地址:http://blog.csdn.net/ ...

  4. Libevent学习之SocketPair实现

    Libevent设计的精化之一在于把Timer事件.Signal事件和IO事件统一集成在一个Reactor中,以统一的方式去处理这三种不同的事件,更确切的说是把Timer事件和Signal事件融合到了 ...

  5. libevent学习笔记 —— 牛刀小试:简易的服务器

    回想起之前自己用纯c手动写epoll循环,libevent用起来还真是很快捷啊!重写了之前学习的时候的一个例子,分别用纯c与libevent来实现.嗯,为了方便对比一下,就一个文件写到黑了. 纯c版: ...

  6. Libevent学习笔记(五) 根据例子学习bufferevent

    libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...

  7. libevent学习文档(三)working with event

    Events have similar lifecycles. Once you call a Libevent function to set up an event and associate i ...

  8. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  9. Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例

    今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...

  10. Libevent学习笔记

    学习: /Users/baidu/Documents/Data/Interview/服务器-检索端/libevent参考手册(中文版).pdf 讲的不好.翻译的..

随机推荐

  1. HTML5 本地存储 [转]

    1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本地客户端程序优于 we ...

  2. document.getElementById/Name/TagName

    document.getElementById 1.getElementById 作用:一般页面里ID是唯一的,用于准备定位一个元素 语法: document.getElementById(id) 参 ...

  3. HTTP客户端之使用request方法向其他网站请求数据

    在node中,可以很轻松的向任何网站发送请求并读取该网站的响应数据. var req=http.request(options,callback); options是一个字符串或者是对象.如果是字符串 ...

  4. Windows下编译sqlite3

    一.下载 sqlite-amalgamation-3240000:sqlite源代码,主要需要头文件sqlite3.h sqlite-dll-win32-x86-3240000.zip:sqlite3 ...

  5. JavaScript 中的函数介绍

    简而言之函数只不过是一组执行某个操作的语句.函数可能会有一些输入参数(在函数体中使用),并在执行后返回值. JavaScript函数也具有这些特性,但它们不仅仅是常规函数.JavaScript函数是对 ...

  6. Java toString()方法

    JDK API java.lang 的Object类中的toString()方法 toString public String toString() 返回该对象的字符串表示.通常,toString 方 ...

  7. libvirt- Virsh 所有命令详单

    help            打印帮助    attach-device   从一个XML文件附加装置    attach-disk     附加磁盘设备    attach-interface 获 ...

  8. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  9. Tkinter Radiobutton

    Python GUI - Tkinter Radiobutton: 这个小部件实现了多项选择按钮,这是一种方式向用户提供许多可能的选择,让用户选择只是其中之一.   这个小部件实现了多项选择按钮,这是 ...

  10. MySQL5.5安装与多实例

    MySQL5.5编译安装 #1.2 cmake软件 cd /home/oldboy/tools/ tar xf cmake-2.8.8.tar.gz cd cmake-2.8.8 ./configur ...