文章目录
- 前言
- 一、libevent
- 二、Libevent模型
-
- 三、支持事件类型
- 四、使用libevent完成TCP服务器端
-
- 总结
前言
简单介绍libevent库以及使用
提示:以下是本篇文章正文内容,下面案例可供参考
一、libevent
Libevent 是开源社区的一款高性能的 I/O 框架库,使用 Libevent 的著名案例有:高性能的分布式内存对象缓存软件 memcached,Google 浏览器Chromium 的 Linux 版本。作为一个I/O 框架库,Libevent 具有如下特点:
◼ 跨平台支持。 Libevent 支持 Linux、Unix 和 Windows。
◼ 统一事件源。Libevent 对 I/O 事件、信号和定时事件提供统一的处理。
◼ 线程安全。Libevent 使用 libevent_pthreads 库来提供线程安全支持。
◼ 基于 Reactor 模式的实现。
二、Libevent模型
1.模型图
2.结构图
三、支持事件类型
四、使用libevent完成TCP服务器端
1.服务器端
代码如下(示例):
include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<event.h>
void recv_cb(int fd,short ev,void*arg)
{
assert(arg!=NULL);
struct event**c_ev=(struct event**)arg;
if(ev & EV_READ)
{
char buff[128]={0};
int n=recv(fd,buff,127,0);
if(n<=0)
{
event_free(*c_ev);
free(c_ev);
c_ev=NULL;
printf("one client close\n");
close(fd);
return;
}
printf("read:%s\n",buff);
send(fd,"ok",2,0);
}
}
void accept_cb(int fd,short ev,void*arg)
{
struct event_base*base=(struct event_base*)arg;
assert(base!=NULL);
if(ev&EV_READ)
{
struct sockaddr_in caddr;
int len=sizeof(caddr);
int c=accept(fd,(struct sockaddr*)&caddr,&len);
if(c<0)
{
return;
}
printf("accept c=%d\n",c);
struct event**p_cev=(struct event**)malloc(sizeof(struct event*));
*p_cev=event_new(base,c,EV_READ|EV_PERSIST,recv_cb,p_cev);
assert(p_cev!=NULL);
event_add(*p_cev,NULL);
}
}
int sockfd_init()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
assert(sockfd!=-1);
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(6000);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
return -1;
}
res=listen(sockfd,5);
if(res==-1)
{
return -1;
}
return sockfd;
}
int main()
{
int sockfd=sockfd_init();
assert(sockfd!=-1);
struct event_base*base=event_init();
assert(base!=NULL);
struct event*sock_ev=event_new(base,sockfd,EV_READ|EV_PERSIST,accept_cb,base);
assert(sock_ev!=NULL);
event_add(sock_ev,NULL);
event_base_dispatch(base);
event_free(sock_ev);
event_base_free(base);
exit(0);
}
总结
1.创建base实例
2.在base上注册事件类型
3.添加事件
4.开启事件监听
5.删除事件以及实例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)