libevent簡單例子。
步驟
-
創建event_base對象。
struct event_base *base = event_base_new(); -
設置需要綁定地址對象。sockaddr_in
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888); -
綁定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));
-
開始時間分發
event_base_dispatch(base); -
釋放資源
evconnlistener_free(listener);
event_base_free(base); -
監聽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;
}