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

 

[cpp]  view plain copy print ?
 
  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寫數據的操作有關。下面是代碼片段:

 

[cpp]  view plain copy print ?
 
  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成員不能正確反映實際的數據。因此我在最后加上一個調用:

 

 

[cpp]  view plain copy print ?
 
  1. buffer.resize(size_);  


再測試。問題解決。

 

 

所以,當用vector構造buffer時要小心他的最小規則。這個問題是我自己的邏輯造成的。‘

不過在之前的那篇文章中寫的遞歸保護代碼也有保險作用。萬一哪天自己又犯了錯誤,至少它能保證數據全部發完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM