libevent 中bufferevent_setcb 之writecb 使用

来源:互联网 发布:什么软件合成视频 编辑:程序博客网 时间:2024/05/29 07:57

今天在做一个要发送大批量数据,该数据长度不定可能有超过几个GB要一次性发送到客户端,我想实现的功能是每100条封装成一个数据包发送给客户端。这时就要通过设置writecb的方式完成发送了。我们在使用bufferevent时所有的例子都只有用到readcb的回调函数,没有发现教人怎么使用writecb回调函数的例子。研究了1上午终于解决了这个问题,具体方法如下:

首先要了解一下writecb被调用的机制, writecb函数将在bufferevent中的output  evbuffer缓冲区发送完成后被调用。

我们根据writecb的被调用机制,很容易就想到了解决办法,第一次先主动调用bufferevent_write函数发送100条数据,同时记录下发送的状态,libevent在这100条记录完全发送出去后将调用writecb函数,这是我们就可以在writecb回调函数中发送下100条数据,直到所有的数据都发送完成。

伪代码如下:

//读数据的回调函数

_on_read(bufferevent *bev, void *arg){

//先接收请求并处理业务

....

//假设发现有10000条记录要发送出去,1次发送10000条将占用大量内存,所以,我们要分批发送

//先发送100条数据,假设每条数据为1024字节

bufferevent_write(bev,buf,1024 *100);

//返回,系统在这100条记录发送完成后将调用writecb回调函数

return;

}

//写数据的回调函数

_on_write(bufferevent *bev, void *arg){

//这时表示output缓冲区的数据已经被完全发送出去,此时我们就可以发送剩下的100条记录

       bufferevent_write(bev,buf,1024 *100);

      //返回,系统将在这100条记录发送完成后再次调用writecb回调函数

     return;

}

----------------------------完成 ---------------------------------

以上只是一个简单的示例,本人写作水平有限,如还有问题可以发送邮件: 17312720@qq.com


2 0
原创粉丝点击