boost::asio async_write也不能保證一次發完所有數據 二
睿豐德科技 專注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?
- 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寫數據的操作有關。下面是代碼片段:
[cpp] view plaincopyprint?
- 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成員不能正確反映實際的數據。因此我在最后加上一個調用:
[cpp] view plaincopyprint?
- buffer.resize(size_);
再測試。問題解決。
所以,當用vector構造buffer時要小心他的最小規則。這個問題是我自己的邏輯造成的。‘
不過在之前的那篇文章中寫的遞歸保護代碼也有保險作用。萬一哪天自己又犯了錯誤,至少它能保證數據全部發完。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成