libevent库学习

388 阅读1分钟
1、作用:
  • 从外面看它就是一个缓冲区,可以与socket绑定
  • 内部由输入与输出缓冲区组成
  • 每一个socket对应一个bufferevent
  • 当socket有事件触发时,可以设置回调函数
2、编译和安装
下载源码

libevent.org/

生成makefile

./configure --prefix=/usr/lib/libevent

编译

make

安装

make install

配置环境变量
 vim ~/.bashrc
 export PKG_CONFIG_PATH=/usr/lib/libevent/lib/pkgconfig:$PKG_CONFIG_PATH
 export LD_LIBRARY_PATH=/usr/lib/libevent/lib:$LD_LIBRARY_PATH

 source ~/.bashrc
检查

$ pkg-config --libs --cflags libevent

-I/usr/lib/libevent/include -L/usr/lib/libevent/lib -levent

3、基础API
event_base_new
event_base_dispatch 
event_new
event_add
event_del
event_free
evconnlistener_new_bind()
struct evconnlistenner* evconnlistener_new_bind(struct event_base *base,
                                        evconnlistener_cb cb,
                                        void *ptr,
                                        unsigned flags,
                                        int backlog,
                                        const struct sockaddr* sa,
                                        )
4、程序
#include<iostream>
#include<event2/listener.h>
#include<event2/bufferevent.h>
#include<event2/buffer.h>
#include<arpa/inet.h>
#define PORT 8111


void on_read_cb(struct bufferevent* bev, void* ctx) 
{
	struct evbuffer *input = NULL;
	struct evbuffer *output = NULL;
	input = bufferevent_get_input(bev);
	output = bufferevent_get_output(bev);
	evbuffer_add_buffer(output, input);
	
}

void on_accept_cb(struct evconnlistener* listener,
					evutil_socket_t fd,
					struct sockaddr* addr,
					int socklen,
					void* ctx) 
{
    struct event_base* base = NULL;	
	struct bufferevent* bev = NULL;
	
	base = evconnlistener_get_base(listener);
	bev = bufferevent_socket_new(base, fd, 0);
	bufferevent_enable(bev, EV_READ | EV_WRITE);
	bufferevent_setcb(bev, on_read_cb, NULL, NULL, NULL);
}

int main() {
	struct sockaddr_in serveraddr;
	struct event_base* base = NULL;
	struct evconnlistener* listener;
	base = event_base_new();
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(PORT);
	serveraddr.sin_addr.s_addr = INADDR_ANY;
	
	listener = evconnlistener_new_bind(base, 
									on_accept_cb, 
									NULL, 
									LEV_OPT_REUSEABLE,
									10,
									(struct sockaddr*)&serveraddr,
									sizeof(serveraddr));
	
	event_base_dispatch(base);
	return 0;
}
g++ -g -o tcpserver tcp_server.cpp `pkg-config --libs --cflags libevent`

检查服务是否已经启动 netstat -ntpl | grep 8111

5、测试

工具:sourceforge.net/projects/so… 用工具代表客户端:

image.png