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 }