#include <event2/event.h>
#include <event2/listener.h>
#include <string.h>
#include <iostream>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
using namespace std;
#define SPORT 5001
static void READ_CB(bufferevent* ev, void* arg)
{
cout<<"read_cb"<<endl;
char szBuff[1024];
int read_len = 0;
memset(szBuff, 0x00, sizeof(szBuff));
read_len = bufferevent_read(ev, szBuff, sizeof(szBuff)-1);
cout<<"read data:"<<szBuff<<endl;
if (strstr(szBuff, "quit"))
{
cout<<"quit"<<endl;
bufferevent_free(ev);
return;
}
bufferevent_write(ev, "OK hello world", 14);
}
static void WRITE_CB(bufferevent* ev, void* arg)
{
cout<<"write_cb"<<endl;
}
//超时、出错、断开连接时事件回调函数被调起
static void EVENT_CB(bufferevent* ev, short what, void* arg)
{
cout<<"event_cb"<<endl;
//超时操作,则
}
static void LISTEN_CB(evconnlistener* ev, evutil_socket_t sock, struct sockaddr* sin, int socklen, void* arg)
{
cout<<"listen"<<endl;
event_base *pevbs = (event_base*)arg;
//创建bufferevent的上下文,BEV_OPT_CLOSE_ON_FREE:清理bufferevent时关闭socket
bufferevent* pbev = bufferevent_socket_new(pevbs, sock, BEV_OPT_CLOSE_ON_FREE);
//添加监控事件,设置bufferevent可读可写权限
bufferevent_enable(pbev, EV_READ|EV_WRITE);
//设置水位:读取水位,设置最低水位,若buffer缓冲中数据<低水位,则不读取
//若>=低水位,则从buffer缓冲中读取数据
bufferevent_setwatermark(pbev, EV_READ,
10, //低水位, 0是无限制,默认是0
0 //高水位,0是无限制,默认是0
);
//高水位:若发送缓冲数据超过高水位,则对数据进行分割为N次,读取事件会被N次触发
/*
bufferevent_setwatermark(pbev, EV_READ,
0, //低水位, 0是无限制,默认是0
10 //高水位,0是无限制,默认是0
);
*/
bufferevent_setwatermark(pbev, EV_WRITE,
1, //低水位, 0是无限制,默认是0
0 //高水位,0是无限制,默认是0
);
//设置读事件超时
struct timeval tv={3, 0};
bufferevent_set_timeouts(pbev, &tv, 0);
//设置读写和超时、断开连接事件回调函数
bufferevent_setcb(pbev, READ_CB, WRITE_CB, EVENT_CB, pbev);
}
int main()
{
int res = 0;
//创建libevent的上下文
event_base * base = event_base_new();
if (!base)
{
cerr << "event_base_new error!" << endl;
return -1;
}
//创建socket
evutil_socket_t sock = socket(AF_INET, SOCK_STREAM, 0);
//设置地址复用和非阻塞
evutil_make_listen_socket_reuseable(sock);
evutil_make_socket_nonblocking(sock);
//设置并绑定ip地址和端口
sockaddr_in sn;
memset(&sn, 0, sizeof(sn));
sn.sin_family = AF_INET;
sn.sin_port = htons(SPORT);
evconnlistener* pevlst = evconnlistener_new_bind(
base,
LISTEN_CB, //listen回调函数
base, //回调函数参数
LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,
10, //监听队列backlog
(sockaddr*)&sn,
sizeof(sn)
);
//事件分发处理
event_base_dispatch(base);
evconnlistener_free(pevlst);
event_base_free(base);
evutil_closesocket(sock);
return 0;
}
libevent bufferevent缓存
最新推荐文章于 2022-03-07 09:18:27 发布