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. 杂项:SpagoBI

    ylbtech-杂项:SpagoBI SpagoBI是一个商业智能平台,为商业智能项目提供了一个完整开源的解决方案.它涵盖了一个BI系统所有方面的功能包括:数据挖掘.查询.分析.报告.Dashboar ...

  2. 在单板上使用WIFI网卡的固件问题

    (在单板上使用WIFI网卡的固件问题)(我的wifi网卡是RT3070) (一般买的网卡说是支持LINUX免驱的话,那么在/lib/firmware/ 下一定有相应的固件) 我将USB网卡接入UBUN ...

  3. node的socket.io类库概述

    socket.io是一个简单的小类库,该类库实现的功能类似于node中的net模块所实现的功能. 这些功能包括websocket通信,xhr轮询,jsonp轮询等. socket类库可以接受所有与服务 ...

  4. vue设置title和ioc图标

    vue设置ioc图标和title 1.ioc图标设置 在根目录中的index.html中引入代码: <link rel="shortcut icon" type=" ...

  5. MantisBT 缺陷管理系统

    简介: 公司需要一套缺陷管理系统,这种系统比较热门的有 Jira.Redmine.MantisBT 等. 这次来整理一下 MantisBT,正好公司需要,以前的文档又丢失了. 下载地址:http:// ...

  6. jira 安装

    jira jira是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪(bug管理).客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域.同禅道等类似. 安装前准备 ...

  7. 复制新增树状数据_ParentID也需要更新

    CREATE TABLE TreeShip(  [ID] uniqueidentifier PRIMARY KEY NOT NULL,  [Name] [nvarchar](50) NULL,  [R ...

  8. 【BZOJ3227】串【广义后缀自动机】

    题意 给出n个字符串,问每个字符串中有多少子串是这所有的n个字符串中至少k个的子串. 分析 广义后缀自动机模板题.对这n个串建广义后缀自动机,对于每个状态维护两个值cou[u]和lcu[u]分别代表拥 ...

  9. NSArray & NSDictionary

    一.NSArray 1.1 简单创建方法由难到简 NSArray *arr = [[NSArray alloc] init]; NSArray *arr = [NSArray arrayWithObj ...

  10. jmeter-plugins-dubbo & DevToolBox

    jmeter-plugins-dubbo使用 A. 下载jmeter并安装,http://jmeter.apache.org/download_jmeter.cgi(文中使用的版本是3.3,理论上高版 ...