libevent详解二(使用)

libevent简单例子。

步骤

  1. 创建event_base对象。
    struct event_base *base = event_base_new();

  2. 设置需要绑定地址对象。sockaddr_in
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);

  3. 绑定ip端口,及回调函数(新链接到来时,即监听的fd可读时),生产evconnlistener对象

struct evconnlistener listener = evconnlistener_new_bind(base,
connect_func, (void
)base,
LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,
(struct sockaddr*)&sin,
sizeof(sin));

  1. 开始时间分发
    event_base_dispatch(base);

  2. 释放资源
    evconnlistener_free(listener);
    event_base_free(base);

  3. 监听fd可读回调函数

当链接到来时,生成1个buffevent对象,然后为此对象设置回调函数。
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, read_func, NULL, NULL, NULL);
bufferevent_enable(bev, EV_READ);

完整例子。

下面是一个echo服务,服务器接收客户端发过来的内容,并且原样发给客户端。

#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>

static void read_func(struct bufferevent *bev, void *ctx){
    //读取bufferevent中客户端发送过来的内容
    char line[1024] = {0};
    int n = bufferevent_read(bev, line, 1000);
    if(n < 0 ){
        return ;
    }
    line[n] = 0;
    printf("receive [%s]\n",line);
    //将客户端内容写入到发送缓冲区
    bufferevent_write(bev, line, n);
}

//处理新链接的回调函数.
static void  connect_func(struct evconnlistener * listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void * arg){
    printf("a new connect!\n");

    struct event_base *base = (struct event_base *) arg;
    struct bufferevent *bev;
    bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    //设置新链接的可读事件回调函数
    bufferevent_setcb(bev, read_func, NULL, NULL, NULL);
    //允许可读事件
    bufferevent_enable(bev, EV_READ);

}


int main(){
    struct event_base *base;
    struct evconnlistener *listener;

    struct sockaddr_in sin;

    base = event_base_new();
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);

    //绑定ip端口,回调函数
    listener = evconnlistener_new_bind(base, connect_func, (void*)base,
            LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,
            (struct sockaddr*)&sin,
            sizeof(sin));

    //开始分发事件
    event_base_dispatch(base);


    //释放
    evconnlistener_free(listener);
    event_base_free(base);

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