#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <event2/event.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/thread.h>
static void conn_readcb(struct bufferevent *bev, void *user_data)
{
char *buff=NULL;
size_t len;
struct evbuffer *buffer;
buffer = bufferevent_get_input(bev);
if(NULL == buffer)
{
printf("get buffer input is error\n");
return;
}
len = evbuffer_get_length(buffer);
buff = (char*)malloc(len+10);
if(NULL == buff)
return;
memset(buff,0,len+10);
bufferevent_read(bev,buff,len+10);
printf("len=%ld -- data=%s\n",len, buff);
free(buff);
return;
}
static void conn_evcb(struct bufferevent *bev, short events, void *user_data)
{
if(events & BEV_EVENT_EOF )
{
printf("conn close\n");
}
if(events & BEV_EVENT_ERROR)
{
printf("conn error\n");
}
if(events & BEV_EVENT_CONNECTED)
{
printf("is connected\n");
return;
}
bufferevent_free(bev);
event_base_loopexit(bufferevent_get_base(bev),NULL);
return;
}
void listen_cb(struct evconnlistener *plisten, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *arg)
{
struct event_base *pbase;
printf("a new connect is come\n");
struct bufferevent *bev;
pbase = evconnlistener_get_base(plisten);
if(NULL == pbase)
{
printf("get pbase error\n");
return;
}
bev = bufferevent_socket_new(pbase,fd,BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE);
if(NULL == bev)
{
printf("buffer socket create error\n");
return;
}
bufferevent_setcb(bev,conn_readcb,NULL,conn_evcb,NULL);
bufferevent_enable(bev, EV_READ);
return;
}
int main(int argc,char *argv[])
{
struct evconnlistener *plisten = NULL;
struct event_base *base = NULL;
struct sockaddr_in seraddr={0};
seraddr.sin_family = AF_INET;
seraddr.sin_port= htons(8899);
seraddr.sin_addr.s_addr = INADDR_ANY;
evthread_use_pthreads();
base = event_base_new();
if(NULL == base)
{
printf("Create base error\n");
return -1;
}
plisten = evconnlistener_new_bind(base,listen_cb,NULL,LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,5,(struct sockaddr*)&seraddr,sizeof(seraddr));
if(NULL == plisten)
{
printf("Create bind error\n");
event_base_free(base);
return -1;
}
event_base_dispatch(base);
if(plisten)
evconnlistener_free(plisten);
if(base)
event_base_free(base);
return 0;
}
gcc -gdwarf-2 -g3 -g evserver.c ./libevent_pthreads.a ./libevent.a -I./include -o pser -lpthread