libevent入门(1)

libevent是什么 

 

libevent 库实际上没有更换 select()poll() 或其他机制的基础。而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包装器。

为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。

通俗的说,libevent是select、poll、epoll等机制的一种封装,使网络编程更方便、减低网络编程的复杂性。

libevent有以下特点:

可移植性:

使用libevent库编写的程序可以运行在所有支持libevent的平台,即时是在不支持非阻塞IO的平台上,libevent库也可以支持一般的IO工作方法。

高效:

使用libevent库编写的程序会使用每个平台最高效的非阻塞IO模型,而不是引入过多的其他的IO机制。

伸缩性强:

使用libevent库编写的程序可以处理大量的网络连接。

便捷性:

libevent是对底层IO机制的封装,可以编写统一的程序,降低IO程序编写的复杂性。

怎么使用libevent

libevent总体API调用过程如下:

(1)event_base_new()  //初始化一个event_base

(2)event_set()  //初始化一个event(事件)结构体,设置事件的文件描述符、事件类型(读IO事件或者写IO事件等)、事件被触发后的回调函数、回调函数的参数

(3)event_base_set()  //给事件设置相应的event_base

(4)event_add()  //把事件添加到队列(就绪队列、active队列等),队列由event对应的event_base管理

(5)event_base_dispatch()  //启动轮询

event_base和event是一对多的关系,一个event_base管理着多个event。

 1 int main()
 2 {
 3
 4     int serFd;
 5     struct sockaddr_in serAddr;
 6
 7     memset(&serAddr, 0, sizeof(serAddr));
 8     serAddr.sin_family = AF_INET;
 9     serAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
10     serAddr.sin_port = htons(8888);
11
12
13     serFd = socket(AF_INET, SOCK_STREAM, 0);
14     bind(serFd, (struct sockaddr*)&serAddr, sizeof(serAddr));
15     listen(serFd, 10);
16
17     //初始化一个event_base
18     base = event_base_new();
19
20     struct event listenEvent;
21
22     //初始化一个event(事件)结构体,设置事件的文件描述符、事件类型(读IO事件或者写IO事件等)、
23     //事件被触发后的回调函数onAccept【该函数需要我们自己实现】、回调函数的参数
24     //EV_PERSIST表示事件的回调函数执行完后,不会把事件listenEvent从base中移除
25     event_set(&listenEvent, serFd, EV_READ|EV_PERSIST, onAccept, NULL);
26
27     //给listenEvent事件设置相应的event_base
28     event_base_set(base, &listenEvent);
29
30      //把事件添加到队列(就绪队列、active队列等),队列由event对应的event_base管理
31     event_add(&listenEvent, NULL);
32
33     //启动轮询
34     event_base_dispatch(base);
35
36     return 0;
37 }

    回调函数:

1 //回调函数包含三个参数
2 //参数1:事件对应的文件描述符
3 //参数2:事件对应的行为 EV_READ|EV_PERSIST
4 //参数3:在event_set函数传入的参数的指针
5 void onAccept(int serFd, short iEvent, void *arg)
6 {
7     //listenEvent事件的回调函数
8 } 
时间: 2024-08-30 05:13:20

libevent入门(1)的相关文章

libevent 入门教程:Echo Server based on libevent(转)

下面假定已经学习过基本的socket编程(socket, bind, listen, accept, connect, recv, send, close),并且对异步/callback有基本的认识. 基本的socket编程是阻塞/同步的,每个操作除非已经完成或者出错才会返回,这样对于每一个请求,要使用一个线程或者单独的进程去处理,系统资源没法支撑大量的请求.Posix定义了可以使用异步的select系统调用,但是因为其采用了轮询的方式来判断某个fd是否变成active,效率不高o(n).于是各

libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。

a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } a:hover { outline: 0; } a:active { outline: 0; } a:hover { color: #005580 !important; text-decoration: underline !important; } blockquote small:b

[z]libevent入门教程:Echo Server based on libevent 不指定

[z]https://www.felix021.com/blog/read.php?2068 花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明,让人马上就能上手用的. 首先给出官方文档吧: http://libevent.org ,首页有个Programming with Libevent,里面是一节一节的介绍libevent,但是感觉信息量太大了,而且还是英文的-.-(当然,如果想好好用libevent,看看还是很有必要的),还有个Ref

libevent入门介绍

libevent是之前看到的一个别人推荐的清凉级网络库,我就想了解一下它.今天下载到了一个人写的剖析系列,从结构和源码方面进行了简要分析.只是这个分析文章是2010年的,有点过时了(跟现在的libevent不太相符).不过看看也好,毕竟模型.原理大部分相同的:http://pan.baidu.com/s/1hqgRJ1M 附官方文档教程:http://www.wangafu.net/~nickm/libevent-book/01_intro.html 不过,在下载上面的剖析之前,下面的文章会帮助

libevent入门

Libevent API =============================== evtimer_new evtimer_new(base, callback, NULL) 用来做定时器,即当达到一定时间后调用回调函数callback.用evtimer_add激活定时器. 比如: my_node->ev_expect_ping = evtimer_new(my_node->base,expected_leader_ping_period, (void*)my_node); evtime

libevent入门(转)

花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明,让人马上就能上手用的. 首先给出官方文档吧: http://libevent.org ,首页有个Programming with Libevent,里面是一节一节的介绍libevent,但是感觉信息量太大了,而且还是英文的-.-(当然,如果想好好用libevent,看看还是很有必要的),还有个Reference,大致就是对各个版本的libevent使用doxgen生成的文档,用来查函数原型和

libevent入门篇

libevent作为一个c网络库具有很好的可移植性.因为他包含了很多可移植的接口封装如linux支持的epoll.select,BSD支持的kqueue,window select等. 学习libevent最好的方式就是阅读源码,首先我们需要看一下libevent的官方网站介绍首先对其有一个了解,介绍是英文写的很好,这里给个链接http://libevent.org/. 看完这个链接后我们其实需要继续学习一下什么叫做异步IO, libevent是这么称呼的,其实IO一共有五种,分别是阻塞IO.非

[原]我在Windows环境下的首个Libevent测试实例

libevent对Windows环境也有很好的支持,不过初次学习和编译libevent简单实例,总是有一些陌生感的,只有成功编译并测试了一个实例,才会有恍然大悟的感觉.下面将要讲到的一个实例是我从网上抄过来的,原创文章地址为:http://www.felix021.com/blog/read.php?2068,表示感谢! 在给出我的第一个测试成功的例子代码之前,简要介绍一下libevent入门的基本知识.原文中作者有一段话是这样的: “基本的socket编程是阻塞/同步的,每个操作除非已经完成或

libevent的入门学习-库的安装【转】

转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现使用了libevent库,就随便学习了一下,这里权作记录 这里是一些不错的文章,感谢作者的无私奉献 libevent学习笔记 一.基础知识 libevent学习笔记(参考libevent深度剖析) libevent学习笔记[使用篇]——(零)异步IO简介[系列译文] Libevent 官方文档学习笔