1. asio::buffer常用的构造方法

asio::buffer有多种的构造方法,而且buffer大小是自动管理的

1.1 字符数组

[cpp] view plain copy  print?
  1. char d1[128];
  2. size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));

1.2 字符向量

[cpp] view plain copy  print?
  1. std::vector<char> d2(128);
  2. size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));

1.3 boost的数组

[cpp] view plain copy  print?
  1. boost::array<char, 128> d3;
  2. size_t bytes_transferred = sock.receive(boost::asio::buffer(d3));

1.4 字符串

[cpp] view plain copy  print?
  1. string str = "hello world";
  2. bytes_transferred = socket.send(boost::asio::buffer(str));

2. asio::buffer的常用方法

2.1 转换方法

[cpp] view plain copy  print?
  1. boost::asio::mutable_buffer b1 =boost::asio::buffer(str);
  2. unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);

2.2 获取大小

[cpp] view plain copy  print?
  1. std::size_t s1 = boost::asio::buffer_size(b1);

3. asio::buffer的读写问题

注意 的是boost::asio::const_buffer是只读的buffer, 而boost::asio::mutable_buffer则可写。
读写buffer也是有讲究的

3.1 与transfer_all()结合

[cpp] view plain copy  print?
  1. boost::array<char, 128> buf;
  2. boost::system::error_code ec;
  3. std::size_t n = boost::asio::read(
  4. socket,
  5. boost::asio::buffer(buf),
  6. boost::asio::transfer_all(),
  7. ec);
  8. if (ec)
  9. {
  10. // An error occurred.
  11. }
  12. else
  13. {
  14. // n == 128
  15. }

boost::asio::transfer_all()能够使buffer中的所有数据都传送完毕。即读满buffer为止。

3.2 与transfer_at_least()结合

[cpp] view plain copy  print?
  1. std::size_t n = boost::asio::read(
  2. socket,
  3. boost::asio::buffer(buf),
  4. boost::asio::transfer_at_least(64),
  5. ec);

意义即读满64字节为止。返回。

当然还有最常用的bytes_transferred,这个例子就很多了。

streambuf

asio::streambuf则是提供了一个流类型的buffer,它自身是能申请内存的。它的好处是可以通过stl的stream相关函数实现缓冲区操作,处理起来更加方便。

//通过streambuf发送数据
    asio::streambuf b;
    std::ostream os(&b);
    os << "Hello, World!\n";

size_t n = sock.send(b.data());    // try sending some data in input sequence
    b.consume(n); // sent data is removed from input sequence

//通过streambuf读数据
    asio::streambuf b;
    asio::streambuf::mutable_buffers_type bufs = b.prepare(512);    // reserve 512 bytes in output sequence
    size_t n = sock.receive(bufs);
    b.commit(n);    // received data is "committed" from output sequence to input sequence

std::istream is(&b);
    std::string s;
    is >> s;

另外,asio名字空间下还提供了一个的read_until函数,可以实现读到满足指定条件的字符串为止,对于解析协议来说非常有用。

size_t n = asio::read_until(sock, stream, '\n');
    asio::streambuf::const_buffers_type bufs = sb.data();
    std::string line(asio::buffers_begin(bufs), asio::buffers_begin(bufs) + n);

这个指定条件除了是字符串外,还可以是正则表达式,非常给力。这也是asio库为什么要依赖于boost.regex的原因。(虽然regex已经标准化了,但仍得使用boost.regex库。等什么时候asio也标准化后估计就可以直接使用std.regex库了)

自定义内存分配

异步IO操作时往往会申请动态内存,使用完后就释放掉;在IO密集型的场景中,频繁的申请释放内存对性能会有较大影响。为了避免这个问题,asio提供了一个内存池式的模型 asio_handler_allocate 和 asio_handler_deallocate 来复用内存。

例子我就不写了,可以参看boost官方文档示例,或者网上的这篇文章。

就我个人而言,并不赞成在项目的前期就使用上这个allocator,毕竟这样带来了很大的代码复杂度。而是作为一个性能优化点,在后期性能优化的时候再试试用它有没有效果。并且内存池的也有很多不同的方案,google的google-perftools也值得一试。

【Boost】boost库asio详解7——boost::asio::buffer用法相关推荐

  1. 【Boost】boost库asio详解6——boost::asio::error的用法浅析

    1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy  print? boost::system::error_code error 我们用这 ...

  2. 使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量、单位和绝对类型

    使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量.单位和绝对类型 实现功能 C++实现代码 实现功能 使用 Boost. ...

  3. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  4. python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理

    原标题:Python:Numpy库基础分析--详解datetime类型的处理 Python:Numpy库基础分析--详解datetime类型的处理 关于时间的处理,Python中自带的处理时间的模块就 ...

  5. linux mysql 静态库_Linux静态库与动态库实例详解

    Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include "test.h" int main(){ te ...

  6. python可以处理多大的数据_科多大数据之Python基础教程之Excel处理库openpyxl详解...

    原标题:科多大数据之Python基础教程之Excel处理库openpyxl详解 科多大数据小课堂来啦~Python基础教程之Excel处理库openpyxl详解 openpyxl是一个第三方库,可以处 ...

  7. NodeMCU 之 U8G2 库使用详解

    NodeMCU 之 U8G2 库使用详解 1.指令 u8g2.clearDisplay(); // 清除显示数据及屏幕u8g2.clearBuffer(); // 清Buffer缓冲区的数据u8g2. ...

  8. STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. python的excell库_扣丁学堂Python基础教程之Excel处理库openpyxl详解

    扣丁学堂Python基础教程之Excel处理库openpyxl详解 2018-05-04 09:49:49 3197浏览 openpyxl是一个第三方库,可以处理xlsx格式的Excel文件.pipi ...

最新文章

  1. 原创文章收录不高从根源找问题
  2. python爬取资料_Python爬取FLASH播放器中的资料
  3. python3贴吧_python3模拟百度登录并实现贴吧自动签到
  4. python大学什么专业学校_好学校的差专业和一般大学的好专业,该怎么选?我来说真话……...
  5. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  6. Java数组实现五子棋功能
  7. html中描述性文本,HTML5文本 描述性信息 引述
  8. c语言三线程,如何用C语言实现多线程
  9. jstl-按照html的形式输出至页面
  10. CCF201512-5 矩阵【矩阵快速幂】(募集解题代码)
  11. (一)洞悉linux下的Netfilteriptables:什么是Netfilter?
  12. Oozie安装ExtJs教程
  13. Linux内存寻址之二:逻辑地址到虚拟地址的转换
  14. Javascript之宿主环境
  15. ROS订阅/cmd_vel话题,转化成移动机器人左右轮的转速
  16. 基于蓝牙5(BTIoT-5)的物联网架构
  17. 【两周快速入门pr】三、定格动画制作-基础操作成就你的脑洞
  18. 【Effective C++】总结
  19. oss 单机游戏云存档
  20. JDK源码中,都有哪些NB的设计模式?

热门文章

  1. flume的概述和运行机制
  2. 单例设计模式-ThreadLocal线程单例
  3. 设计模式之_Iterator_03
  4. 联发科mtk手机处理器怎么样_5G手机价格将再探新低!联发科天玑700芯片发布:入门级5G处理器...
  5. d3中文案例_D3.js柱状图例子
  6. 200917阶段一C++双向链表模板
  7. 以下结点node定义了一个学生的信息。函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针
  8. 【翻译】Nginx的反向代理
  9. top.location.href和localtion.href有什么不同
  10. bzoj2442codevs4654 单调队列优化dp