博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libevent入门(1)
阅读量:4456 次
发布时间:2019-06-08

本文共 2170 字,大约阅读时间需要 7 分钟。

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_base18     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_base28     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_PERSIST4 //参数3:在event_set函数传入的参数的指针5 void onAccept(int serFd, short iEvent, void *arg) 6 { 7     //listenEvent事件的回调函数8 }

 

 

转载于:https://www.cnblogs.com/szuyuan/p/4013359.html

你可能感兴趣的文章
javaweb(八)——HttpServletResponse对象(二)
查看>>
DbSchema注册码生成
查看>>
原根、与原根的应用(更新中)
查看>>
代理模式之静态代理
查看>>
微软MSN为吸引年轻人推出趋势追踪服务msnNOW
查看>>
Oracle数据处理
查看>>
SQL Server 2005中的类型与C#中的类型对应关系
查看>>
EntityConnection.ConnectionString 属性
查看>>
SimpleThreadPool
查看>>
快速理解聚合根、实体、值对象的区别和联系
查看>>
PAT——1030. 完美数列
查看>>
SPOJ简介。
查看>>
HGOI 20181028 题解
查看>>
python with as的用法
查看>>
Spring MVC 整合Activiti5.22配置详解
查看>>
『Python基础-14』匿名函数 `lambda`
查看>>
java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素
查看>>
jquery: 一些常见的获取
查看>>
phalcon: acl权限控制
查看>>
[转] Oracle数据库System Global Area(SGA)的理解
查看>>