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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章