只有看boost源码才能弄明白发生了什么。首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象。

参考该文档的重载形式:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/buffer/overload24.html

buffer (24 of 28 overloads)Create a new modifiable buffer that represents the given POD vector.template<typename PodType,typename Allocator>
mutable_buffers_1 buffer(std::vector< PodType, Allocator > & data,std::size_t max_size_in_bytes);
Return ValueA mutable_buffers_1 value equivalent to:mutable_buffers_1(data.size() ? &data[0] : 0,min(data.size() * sizeof(PodType), max_size_in_bytes));

注意,上面的代码最后一部分就是解释了内部原理。原来是调用vector的size成员函数,然后和传入的size比较,谁小用谁。会不会是我的vector::size返回的不是54,而是9呢。

很快我加上日志追踪,果然是9. 为什么呢? 这肯定和我对vector写数据的操作有关。下面是代码片段:

void ConfigMessage::Write(vector<char>& buffer) {buffer.assign(9, 0);// SOHbuffer[0] = 0x01;// Typesize_t i = 3;buffer[i++] = 'U';buffer[i++] = '1';size_t len = domain.length();buffer[i++] = static_cast<uint8_t>(len);memcpy(&buffer[i], domain.c_str(), len);i += len;uint16_t temp = Int16ToBigEndian<uint16_t>(port);memcpy(&buffer[i], &temp, 2);i += 2;buffer[i++] = timezone;

我基本上当作一个C的缓冲区在用memcpy来填入数据,因此vector的size成员不能正确反映实际的数据。因此我在最后加上一个调用:

  buffer.resize(size_);

再测试。问题解决。

所以,当用vector构造buffer时要小心他的最小规则。这个问题是我自己的逻辑造成的。‘

不过在之前的那篇文章中写的递归保护代码也有保险作用。万一哪天自己又犯了错误,至少它能保证数据全部发完。

boost::asio async_write也不能保证一次发完所有数据 二相关推荐

  1. boost::asio async_write也不能保证一次发完所有数据 一

    你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去.并且提到如果想这样做,需要使用boost asio的async_wr ...

  2. 网上收集下boost::asio发送与传输相关的几个函数,老是忘记

    刚连接上:调用async_accept 1 boost::shared_ptr<tcp::socket> spMySocket(new tcp::socket(m_ioservice)); ...

  3. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  4. boost asio 异步实现tcp通讯

    一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...

  5. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  6. Boost.Asio使用实例

    1.概述: Boost.Asio是一个跨平台的C++库,用于网络和底层I/O编程,可以在I/O对象(如socket)上执行同步和异步操作. 2.简略的过程分析.以socket的连接操作为例: 你的程序 ...

  7. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

  8. Boost asio 官方教程简介

    1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理 ...

  9. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

最新文章

  1. halcon知识:【1】二维码原理
  2. python 语言教程(3)变量之数字类型
  3. 微信小程序 封装接口
  4. 2019ICPC(徐州) - Loli, Yen-Jen, and a cool problem(广义后缀自动机)
  5. figma下载_搬到Figma对我意味着什么
  6. Flutter AnimatedSwitcher 动画切换组件的基本使用
  7. 毕设题目:Matlab图像隐写
  8. JBPM工作流框架应用
  9. mac 终端 常用命令
  10. win7主题文件夹背景破解
  11. 力扣刷题 DAY_70 回溯
  12. Ocelot对Consul进行配置,通过Ocelot访问502错误问题
  13. Windows系统下运行hadoop、HBase程序出错Could not locate executablenull\bin\winutils.exe in the Hadoop binaries
  14. PCB制板总结(AD制图)
  15. 二维码登录原理+Web端即时通讯技术
  16. Gunicorn-配置详解
  17. linux中单引号、双引号
  18. jeebbs开源博客软件默认后台登录地址
  19. HTTP访问控制(CORS) 跨域访问
  20. joomlaQQ登录,微信登录

热门文章

  1. 2019电子科大计算机基础知识,电子科技大学820真题1999-2019终极版.pdf
  2. android上传文件用哪个布局,每周总结20130821——android控件的尺寸、http文件上传...
  3. PHP和ajax请求_「jQuery+PHP」ajax请求以及接口PHP响应教程
  4. 小程序秒杀活动服务器,一套实用的小程序秒杀活动方案,亲这边建议你收藏哦...
  5. HEVC官方代码下载及码流分析软件使用
  6. python读取txt、csv以及xml文件
  7. 性能测试利器 - Locust框架解析
  8. 这个简单的常见面试题,怎么答才会加分?
  9. c语言1l是多少,1千克等于多少升(一千克等于一升啊)
  10. 海兰一体计算机参数,海兰幽灵X7电竞一体机怎么样-海兰幽灵X7电竞一体机评测...