基于socket的bufferevent由一个socket的传输层和read/write buffer组成。区别于常规的event,当socket可读或者可写时会回调用户的callback,bufferevent当读取或者写入足够多的数据到evbuffer后,才回调用户回调函数。这个足够多的数据由水位线(watermarks)定义。
Read low-water mark当输入缓存中读入的数据超过这个水位线则触发用户callback回调,默认是0,所以每次读都会导致callback被调用。Read high-water mark假如输入缓存中读入的数据超过这个水位线,会disable调读事件,直到输入缓存变小。Write low-water mark当输出缓存不高于这个水位线,则触发用户写callback回调。Write high-water mark在socket bufferevent中没有使用。
源码实现在bufferevent_sock.c中。核心函数描述如下:bufferevent_socket_new主要是:1.在常规event基础上设置读写事件callback(bufferevent_readcb, bufferevent_writecb);2.enable可写事件,使得任何添加到output缓存中的内容能在bufferevent_writecb中写出去;
_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使用的buffer都是一种叫做evbuffer的数据结构,定义在evbuffer-internal.h,总的来说是一段一段连续内存被链表串起来的结构,每一段内存又叫做evbuffer_chain。(待续。。。)
转载于:https://www.cnblogs.com/persistentsnail/p/3545531.html
相关资源:数据结构—成绩单生成器