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;
}