zoukankan      html  css  js  c++  java
  • libevent之基于socket的bufferevent

    基于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 16384
    evbuffer_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。(待续。。。)

  • 相关阅读:
    Android:res之layer-list的用法
    Android:改变Activity切换方式
    Android:dimen尺寸资源文件的使用
    Android Studio安装、配置
    Android Studio 初探
    Android SDK开发包国内下载地址
    linux下centos安装android sdk最新全面教程【可行】
    CentOS 7.0安装Nvidia驱动
    javascript基础部分
    js api 实现钉钉免登
  • 原文地址:https://www.cnblogs.com/persistentsnail/p/3545531.html
Copyright © 2011-2022 走看看