bufferevent服务器的实现,使用libevent库

gcc -o bufevent buffevent.c -levent
可以使用shell命令
nc 127.1 8765 验证

使用bufferevent用到的函数

//创建事件处理框架
struct event_base*event_base_new(void);
//创建带缓冲区的套接字
bufferevent_socket_new(struct event_base *base,
evutil_socket_t fd,enum bufferevent_options options);
options: BEV_OPT_CLOSE_ON_FREE//释放 bufferevent 时关闭底层传输端口。这将关闭底层套接字,释放底层 bufferevent 等
//服务器端用的函数,创建监听
struct evconnlistener *evconnlistener_new_bind(struct event_base *base,evconnlistener_cb cb,void*ptr,
unsigned flags, int backlog,const struct sockaddr *sa, int socklen)
//启动循环
int event_base_dispatch(struct event_base* base)
//释放资源
void event_free(struct event *event)
event_base_free(struct event_base* base)
void evconnlistener_free(struct evconnlistener *lev);
//读数据,从bufferevent的输入缓冲区移除数据
size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
//发送数据 往缓冲区中写数据
 bufferevent_write(struct bufferevent *bufev,const void *data, size_t size);
//释放bufferevent操作
void bufferevent_free(struct bufferevent *bev)
//连接完成后,对应通信操作
 void listen_cb(struct evconnlistener*listener,evutil_socket_t fd,struct sockaddr *addr,int len,void*ptr)
//设置回调函数
bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb read_cb, 
bufferevent_data_cb write_cb,
bufferevent_event_cb event_cb, 
void *cbarg);
//读写缓冲区回调操作
typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx)
typedef void (*bufferevent_event_cb)(struct bufferevent *bev,short events, void *ctx)
 //设置缓冲区的回调可用,默认写是可用的,读是不可用的
bufferevent_enable(bev,EV_READ);

  1	#include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<string.h>
  7 #include<event2/event.h>
  8 #include<event2/bufferevent.h>
  9 #include<event2/listener.h>
 10 
 11 //读回调
 12 void read_cb(struct bufferevent *bev,void *arg)
 13 {
 14 char buf[1024] = {0};
 15 bufferevent_read(bev,buf,sizeof(buf));
 16 printf("recv buf:%s\n",buf);
 17 char*pt="你发送的数据我已经收到了。。。、\n";
 18 //发送数据 往缓冲区中写数据
 19 bufferevent_write(bev,pt,strlen(pt)+1);
 20 printf("我发送了数据,给客户端。。。。、\n");
 21 }
 22 //写回调
 23 void write_cb(struct bufferevent*bev,void*arg)
 24 {
 25 printf("我已经给客户端发送完了数据....\n");
 26 }
 27 //事件回调
 28 void event_cb(struct bufferevent*bev,short events,void *aeg)
 29 {
 30 if(events&BEV_EVENT_EOF)
 31 {
 32 printf("connection closed\n");
 33 }
 34 else if(events&BEV_EVENT_ERROR)
 35 {
printf("some other error\n");
 37 }
 38 //释放bufferevent资源
 39 bufferevent_free(bev);
 40 }
 41 
 42 
 43 //连接完成后,对应通信操作
 44 void listen_cb(struct evconnlistener*listener,evutil_socket_t fd,
 45                 struct sockaddr *addr,int len,void*ptr)
 46 {
 47 //得到传进来的event_base
 48 struct event_base*base =(struct event_base*)ptr;
 49 //先接受数据 再发送数据
 50 
 51 //将fd封装为bufferevent带缓冲区的事件
 52 struct bufferevent*bev=NULL;
 53 bev=bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
 54 //给读写缓冲区设置回调
 55 bufferevent_setcb(bev,read_cb,write_cb,event_cb,NULL);
 	//设置缓冲区的回调可用,默认写是可用的,读是不可用的
 56 bufferevent_enable(bev,EV_READ);
 57 }
 58 int main(int argc,char*argv[])
 59 {
  //创建事件处理框架
 61 struct event_base*base=event_base_new();
 62 //init server info
 63 struct sockaddr_in serv;
 64 memset(&serv,0,sizeof(serv));
 65 serv.sin_family=AF_INET;
 66 serv.sin_port=htons(8765);
 67 serv.sin_addr.s_addr=htonl(INADDR_ANY);
 68 //创建监听套接字
 69 //绑定
 70 //监听
 71 //等待并接受连接
 72 struct evconnlistener* listen=NULL;
 73
 74
 75 //服务器端用的函数
 75 //有新连接时,回调listen_cb被调用
 76 listen=evconnlistener_new_bind(base,listen_cb,base,LEV_OPT_CLOSE_ON_FREE|LEV    _OPT_REUSEABLE,36,(struct sockaddr*)&serv,sizeof(serv));
 77 //开始事件循环
 78 event_base_dispatch(base);
 79 //释放资源
 80 evconnlistener_free(listen);
 81 event_base_free(base);
 82 return 0;
 83
 84 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值