DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

只有看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

 

  1. buffer (24 of 28 overloads)  
  2.   
  3. Create a new modifiable buffer that represents the given POD vector.  
  4.   
  5. template<  
  6.     typename PodType,  
  7.     typename Allocator>  
  8. mutable_buffers_1 buffer(  
  9.     std::vector< PodType, Allocator > & data,  
  10.     std::size_t max_size_in_bytes);  
  11. Return Value  
  12.   
  13. A mutable_buffers_1 value equivalent to:  
  14.   
  15. mutable_buffers_1(  
  16.     data.size() ? &data[0] : 0,  
  17.     min(data.size() * sizeof(PodType), max_size_in_bytes));  


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

 

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

 

  1. void ConfigMessage::Write(vector<char>& buffer) {  
  2.   buffer.assign(9, 0);  
  3.   // SOH  
  4.   buffer[0] = 0x01;  
  5.   
  6.   // Type  
  7.   size_t i = 3;  
  8.   buffer[i++] = 'U';  
  9.   buffer[i++] = '1';  
  10.     
  11.   size_t len = domain.length();  
  12.   buffer[i++] = static_cast<uint8_t>(len);  
  13.   memcpy(&buffer[i], domain.c_str(), len);  
  14.   i += len;  
  15.   
  16.   uint16_t temp = Int16ToBigEndian<uint16_t>(port);  
  17.   memcpy(&buffer[i], &temp, 2);  
  18.   i += 2;  
  19.   
  20.   buffer[i++] = timezone;  


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

 

 

  1. buffer.resize(size_);  


再测试。问题解决。

 

 

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

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

posted on   DoubleLi  阅读(3806)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示