boost::asio async_write也不能保证一次发完所有数据 二
只有看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也不能保证一次发完所有数据 二相关推荐
- boost::asio async_write也不能保证一次发完所有数据 一
你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去.并且提到如果想这样做,需要使用boost asio的async_wr ...
- 网上收集下boost::asio发送与传输相关的几个函数,老是忘记
刚连接上:调用async_accept 1 boost::shared_ptr<tcp::socket> spMySocket(new tcp::socket(m_ioservice)); ...
- boost::asio译文
boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...
- boost asio 异步实现tcp通讯
一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...
- Boost.Asio技术文档汇总
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- Boost.Asio使用实例
1.概述: Boost.Asio是一个跨平台的C++库,用于网络和底层I/O编程,可以在I/O对象(如socket)上执行同步和异步操作. 2.简略的过程分析.以socket的连接操作为例: 你的程序 ...
- 基于boost asio实现的支持ssl的通用socket框架
情景分析 现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下 ...
- Boost asio 官方教程简介
1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理 ...
- boost::asio中文文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
最新文章
- halcon知识:【1】二维码原理
- python 语言教程(3)变量之数字类型
- 微信小程序 封装接口
- 2019ICPC(徐州) - Loli, Yen-Jen, and a cool problem(广义后缀自动机)
- figma下载_搬到Figma对我意味着什么
- Flutter AnimatedSwitcher 动画切换组件的基本使用
- 毕设题目:Matlab图像隐写
- JBPM工作流框架应用
- mac 终端 常用命令
- win7主题文件夹背景破解
- 力扣刷题 DAY_70 回溯
- Ocelot对Consul进行配置,通过Ocelot访问502错误问题
- Windows系统下运行hadoop、HBase程序出错Could not locate executablenull\bin\winutils.exe in the Hadoop binaries
- PCB制板总结(AD制图)
- 二维码登录原理+Web端即时通讯技术
- Gunicorn-配置详解
- linux中单引号、双引号
- jeebbs开源博客软件默认后台登录地址
- HTTP访问控制(CORS) 跨域访问
- joomlaQQ登录,微信登录
热门文章
- 2019电子科大计算机基础知识,电子科技大学820真题1999-2019终极版.pdf
- android上传文件用哪个布局,每周总结20130821——android控件的尺寸、http文件上传...
- PHP和ajax请求_「jQuery+PHP」ajax请求以及接口PHP响应教程
- 小程序秒杀活动服务器,一套实用的小程序秒杀活动方案,亲这边建议你收藏哦...
- HEVC官方代码下载及码流分析软件使用
- python读取txt、csv以及xml文件
- 性能测试利器 - Locust框架解析
- 这个简单的常见面试题,怎么答才会加分?
- c语言1l是多少,1千克等于多少升(一千克等于一升啊)
- 海兰一体计算机参数,海兰幽灵X7电竞一体机怎么样-海兰幽灵X7电竞一体机评测...