libevent bufferevent缓存

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值