只有看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 Value
A 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);
// SOH
buffer[0] = 0x01;
// Type
size_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::serialport类实现串口通信的例子
boost::asio::serial下6个工程演示多种串口读取写入方式方法,包含simple,with_timeout,async,callback,qt_integration,stream 等多个工程演示多种方式读取,写入串口,char,string ,buffer[]等多种数据格式。
boost::asio完成了通讯模块的编写,界面用MFC简单做了一下。 局域网的测试结果: 传输速度在6-7m/s 并发到500,服务器CPU和网络应用均出现使用99%的情况出现硬件瓶颈,新连接无法建立(测试服务器比较差,CPU:...
boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...
利用boost::asio 搭建一个C/S架构的服务端模型。 该服务端支持客户端长连接。 链接到其他服务器使用了链接池。
在C++编程领域,有一段备受推崇的代码——“boost::asio”,它被认为是世界上最强大的C++代码之一。它是一个跨平台的网络编程库,提供了异步I/O、TCP/UDP套接字、定时器、信号处理等功能。本文将为您详细介绍boost::...
很简单的异步通信例子,实现了Server端接收客户端信息。
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.50.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
Boost.Asio C++ Network Programming
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.50.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.50.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
boost::asio tcp服务器的实现 封装socket, 监听socket, C++11智能指针, 要求: vs2012或以上版本
这样带来一个问题,原来所有的接口中的boost::shared_ptr<std::string>数据类型,全部换成了std::string引用,升级到2.3的朋友要注意修改之前重写虚函数的签名,如果不改,则重写肯定不生效,变成了新增加虚函数了...
boost asio chat client
需要包含boost的路径为: include path: F:\boost_1_53_0 lib path:F:\boost_1_53_0\stage\lib 需要预定义的宏: _WIN32_WINNT=0x0700 在程序里写的接收ip为192.168.1.206,端口为 9002
boost::asio的例子,修改后的vs2005项目
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...