- 实现代码
#include <stdio.h>
#include <string.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
void read_cb(struct bufferevent * bev,void * ctx)
{
char tmp[1024] = {0};
bufferevent_read(bev,tmp,sizeof(tmp));
printf("server:%s\n",tmp);
char tmp2[] = {"已经接受到数据!\n"};
bufferevent_write(bev,tmp2,strlen(tmp2)+1);
printf("getdata and recv it!\n");
}
void write_cb(struct bufferevent * bev ,void * ctx)
{
printf("数据已经发送出去了!\n");
}
void event_cb(struct bufferevent * bev,short events,void * ctx)
{
if(events & BEV_EVENT_EOF)
{
printf("connection close\n");
}
else if(events & BEV_EVENT_ERROR)
{
printf("some others error\n");
}
bufferevent_free(bev);
}
void listen_cb(struct evconnlistener * listener,evutil_socket_t fd,struct sockaddr * addr,int len, void * ptr)
{
struct event_base * base = (struct evrnt_base *)ptr;
struct bufferevent * bev = NULL;
bev = bufferevent_socket_new(base,fd ,BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev,read_cb,write_cb,event_cb,NULL);//给读写缓冲设置回调函数
bufferevent_enable(bev,EV_READ);//设置读缓冲区可用,写缓冲区默认可用
}
int main(int argc, const char *argv[])
{
//创建事件管理器
struct event_base * base = NULL;
base = event_base_new();
//创建IP和端口
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(1111);
serv.sin_addr.s_addr = htonl(INADDR_ANY);
//创建事件监听器
struct evconnlistener* listen = NULL;
listen = evconnlistener_new_bind(base,listen_cb,base,LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,-1,(struct sockaddr*)&serv,sizeof(serv));
//循环执行
event_base_dispatch(base);
//释放资源
evconnlistener_free(listen);
event_base_free(base);
return 0;
}
- 现象
客户端:
服务器: