libevent 之 基本服務端的使用

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章