libevent入门(1)

时间:2023-03-09 05:51:55
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。
 int main()
{ int serFd;
struct sockaddr_in serAddr; memset(&serAddr, , sizeof(serAddr));
serAddr.sin_family = AF_INET;
serAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serAddr.sin_port = htons(); serFd = socket(AF_INET, SOCK_STREAM, );
bind(serFd, (struct sockaddr*)&serAddr, sizeof(serAddr));
listen(serFd, ); //初始化一个event_base
base = event_base_new(); struct event listenEvent; //初始化一个event(事件)结构体,设置事件的文件描述符、事件类型(读IO事件或者写IO事件等)、
//事件被触发后的回调函数onAccept【该函数需要我们自己实现】、回调函数的参数
//EV_PERSIST表示事件的回调函数执行完后,不会把事件listenEvent从base中移除
event_set(&listenEvent, serFd, EV_READ|EV_PERSIST, onAccept, NULL); //给listenEvent事件设置相应的event_base
event_base_set(base, &listenEvent); //把事件添加到队列(就绪队列、active队列等),队列由event对应的event_base管理
event_add(&listenEvent, NULL); //启动轮询
event_base_dispatch(base); return ;
}

    回调函数:

 //回调函数包含三个参数
//参数1:事件对应的文件描述符
//参数2:事件对应的行为 EV_READ|EV_PERSIST
//参数3:在event_set函数传入的参数的指针
void onAccept(int serFd, short iEvent, void *arg)
{
//listenEvent事件的回调函数
}