zoukankan      html  css  js  c++  java
  • 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

    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时要小心他的最小规则。这个问题是我自己的逻辑造成的。‘

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

  • 相关阅读:
    Servlet编程寄语
    filter常用功能
    Javascript的自动、定时执行和取消
    CentOS 5安装GIT的基本命令
    EF调用执行Oracle中序列
    WCF使用IIS发布服务的配置
    linux 自学系列:debian更新软件列表、更改源
    shell编程笔记五:select
    linux 自学系列: 改IP地址,主机名及DNS
    shell编程笔记四:case in
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3167662.html
Copyright © 2011-2022 走看看