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. ALSA声卡16_编写ALSA声卡应用程序_学习笔记

    1.体验 (1)ALSA声卡使用体验:使用arecord录音,使用aplay播放,在Alsa-utils里面) 准备: cd linux-3.4.2 patch -p1 < ../linux-3 ...

  2. jaxp使用笔记

    XML文件的解析技术有DOM和SAX方式,在Android中还有pull解析方式,这里不再讨论 DOM解析的方式和js中的DOM操作是一致的,DOM解析一次将文档加载入内存建立树型模型,但是如果XML ...

  3. Android:ScrollView和SwipeRefreshLayout高度测量

    今天组里的同事要做一个奇葩的效果,要求在ScrollView里嵌套一个RefreshLayout.类似代码如下: <?xml version="1.0" encoding=& ...

  4. Linux 利用hosts.deny 防止暴力破解ssh

    一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...

  5. apache 自定义404错误页面

    1.有些提供web服务的网站,在用户访问一个不存在的网站文件时,会提示404错误,如下所示: 现在要求自定义一个错误页面,也就是出现404错误代码时,跳转到我们自定义的网址上.下面记录下方法: 1.编 ...

  6. 两栏自适应布局,右侧div宽高不定

    .main,.sitebar{       height: 300px;       font: bolder 20px/300px "微软雅黑";       color: bl ...

  7. 脱壳系列(五) - MEW 壳

    先用 PEiD 看一下 MEW 11 1.2 的壳 用 OD 载入程序 按 F8 进行跳转 往下拉 找到这个 retn 指令,并下断点 然后 F9 运行 停在该断点处后再按 F8 右键 -> 分 ...

  8. ubuntu apt-get dpkg-scanpackages 制作本地软件源

    1. 收集软件,下载的软件都在/var/cache/apt/archives目录下 例如openstack L版的所有包 keystone,glance nova neutron....... 举例: ...

  9. [Z]shell变量详解

    原文:http://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html 1 shell变量基础shell变量是一种很“弱”的变量,默认 ...

  10. 【Oracle】Oracle透明网关访问MSSQLServer

             Oracle 数据库的透明网关 ( transparent gateway )是这样的一个接口:通过它,我们可以 sqlplus 操纵其他数据库,如 MS SQLServer . s ...