libevent之基于socket的bufferevent

it2022-06-29  74

基于socket的bufferevent由一个socket的传输层和read/write buffer组成。区别于常规的event,当socket可读或者可写时会回调用户的callback,bufferevent当读取或者写入足够多的数据到evbuffer后,才回调用户回调函数。这个足够多的数据由水位线(watermarks)定义。

bufferevent四种watermarks:

Read low-water mark当输入缓存中读入的数据超过这个水位线则触发用户callback回调,默认是0,所以每次读都会导致callback被调用。Read high-water mark假如输入缓存中读入的数据超过这个水位线,会disable调读事件,直到输入缓存变小。Write low-water mark当输出缓存不高于这个水位线,则触发用户写callback回调。Write high-water mark在socket bufferevent中没有使用。

基于socket的buffeevent

源码实现在bufferevent_sock.c中。核心函数描述如下:bufferevent_socket_new主要是:1.在常规event基础上设置读写事件callback(bufferevent_readcb, bufferevent_writecb);2.enable可写事件,使得任何添加到output缓存中的内容能在bufferevent_writecb中写出去;

bufferevent_readcb:

149 if (bufev->wm_read.high != 0) { 150 howmuch = bufev->wm_read.high - evbuffer_get_length(input); 151 /* we somehow lowered the watermark, stop reading */ 152 if (howmuch <= 0) { // 如果超过了read high watermark需要disable read event,停止读取socket 153 bufferevent_wm_suspend_read(bufev); 154 goto done; 155 } 156 } 157 readmax = _bufferevent_get_read_max(bufev_p); 158 if (howmuch < 0 || howmuch > readmax) /* The use of -1 for "unlimited" 159 * uglifies this code. XXXX */ 160 howmuch = readmax;

 

_bufferevent_get_read_max返回一次最多读取多少数据,其实是:#define MAX_TO_READ_EVER 16384之后就是真正从socket读数据到input buffer中了,函数evbuffer_read从指定fd读取指定字节到指定evbuffer。socket可写的时候回调bufferevent_writecb,这个函数主要是吧output buffer中的数据写出去,每次写也有个最大字节数限制:#define MAX_TO_WRITE_EVER 16384evbuffer_write_atmost便是把output buffer中的数据发送出去的功能函数,总的来说写和读比较对称,首先都是操作一个buffer,读的时候是增大input buffer,写的时候是清空output buffer,写的时候有一个细节,每次写完判断output buffer是否为空,如果空了就disable write event,这时为了防止没必要的可写事件唤醒浪费CPU时间。

bufferevent的缓冲区evbuffer

bufferevent使用的buffer都是一种叫做evbuffer的数据结构,定义在evbuffer-internal.h,总的来说是一段一段连续内存被链表串起来的结构,每一段内存又叫做evbuffer_chain。(待续。。。)

转载于:https://www.cnblogs.com/persistentsnail/p/3545531.html

相关资源:数据结构—成绩单生成器

最新回复(0)