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。(待续。。。)
libevent之基于socket的bufferevent的更多相关文章
- libevent笔记6:ssl bufferevent
Libevent另外提供了基于openssl的bufferevent来支持ssl,通过特殊的ssl bufferevent来对数据进行加密. ps:本文不对openssl相应的接口做介绍因为不熟 SS ...
- 基于Socket客户端局域网或广域网内共享同一短信猫收发短信的开发解决方案
可使同一网络(局域网或广域网)内众多客户端,共享一个短信猫设备短信服务器进行短信收发,短信服务器具备对客户端的管理功能. 下面是某市建设银行采用本短信二次开发平台时实施的系统方案图: 在该方案中,考虑 ...
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
- memcached基于socket访问memcache缓存服务器
memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...
- MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架
MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架
- 在线白板,基于socket.io的多人在线协作工具
首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...
- Android 基于Socket的聊天应用(二)
很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...
- 基于Socket的UDP发包程序
UDP(User Datagram Protocol,用户数据报协议)是在互联网中常用的传输层协议,该协议提供了向另一用户程序发送的消息的最简便的协议机制.与TCP一样,其默认的下层协议是IP.UDP ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
随机推荐
- SpringBoot 与 SpringSecurity
一.环境搭建 (1)IDEA创建SpringBoot工程 (2)导入依赖 (3)如果是thymeleaf项目 需导入thymeleaf整合security的依赖 (4)编写配置类(采用AOP横切入程序 ...
- 一道java算法题
12个人围成一圈,序号依次从1至12,从序号1开始顺时针依次数,数到7的人退出,下一个再依次从1开始数,求留下来的最后一个人的原始序号. public static void joseph(int[] ...
- 使用iconv进行文件编码转换
在使用科大讯飞的时候输出字符是gbk字符编码.但是在ubuntu下gbk显示乱码,故用iconv进行字符编码转换.下面是我整理的字符编码转化的程序案例.从gbk2312转换到utf-8. 程序代码: ...
- springboot文件上传问题记录
最近做项目需要开发一个通过excel表格导入数据的功能,上传接口写好调试的时候遇到几个问题,记录一下. 报错1: 15:50:57.586 [[1;33mhttp-nio-8763-exec-8 [0 ...
- JavaDailyReports10_17
学习JavaWeb第一天 输出我的第一个HelloWorld! 1 <%@ page language="java" import="java.util.*&quo ...
- React 入门-写个 TodoList 实例
React 是一个用于构建用户界面的 JavaScript 库,主要特点有: 声明式渲染:设计好数据和视图的关系,数据变化 React 自动渲染,不必亲自操作DOM 组件化:页面切分成多个小部件,通过 ...
- Centos7无网络下安装mysql5.7——mysql-rpm安装
本教程指将mysql安装到系统默认目录下,如想自定义修改目录,请在rpm安装时自行修改: rpm -ivh --prefix= /opt xxx.rpm #将xxx.rpm安装到/opt下 一.下载m ...
- 分布式一致性协议 Raft
分布式领域,CP模型下 数据一致性协议至关重要,不然两边数据不一致容易出现数据读混乱问题.像Etcd Consul zookeeper Eureka ,Redis集群方案这些中间件 都有一致性算法来 ...
- TurtleBot3 Waffle (tx2版华夫)(12)建图-hector建图
1)[Remote PC] 启动roscore $ roscore 2)[TurBot3] 启动turbot3 $ roslaunch turbot3_bringup minimal.launch 3 ...
- 你一定需要知道的高阶JAVA枚举特性!
JAVA枚举,比你想象中还要有用! 我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值. 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义. 当我第一次了解枚举 ...