<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    boost::asio async_write也不能保證一次發完所有數據 二

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    只有看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 plaincopyprint?  
    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 plaincopyprint?  
    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 plaincopyprint?  
    1. buffer.resize(size_);  


    再測試。問題解決。

     

     

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

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全