boost asio async\u read\u一些只读数据块 我有一个C++服务器,它使用Booo::ASIO来进行读/写操作-写出消息工作得很好,但是由于某种原因,我不能使读工作

boost asio async\u read\u一些只读数据块 我有一个C++服务器,它使用Booo::ASIO来进行读/写操作-写出消息工作得很好,但是由于某种原因,我不能使读工作,c++,boost,boost-asio,C++,Boost,Boost Asio,我从客户端向其发送的消息是15 16位无符号短消息-我的测试消息如下: 1, 34, 7, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0 现在在服务器上,我经常看到这样的事情。读数通常被分解和/或乘以256 这是一次运行,发送两次 reading length = 8: [1 34 7 0 0 0 0 0] reading length = 3: [1024 0 0] reading length = 3: [0 0 0] reading length = 8: [1

我从客户端向其发送的消息是15 16位无符号短消息-我的测试消息如下:

1, 34, 7, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0
现在在服务器上,我经常看到这样的事情。读数通常被分解和/或乘以256

这是一次运行,发送两次

reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 3: [1024 0 0]
reading length = 3: [0 0 0]
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
reading length = 6: [1 34 7 0 0 0]
reading length = 1: [0] 
reading length = 0: []
reading length = 0: []
reading length = 2: [0 0]
reading length = 2: [0 0]
reading length = 1: [0]
这是第二次发送两次

reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 3: [1024 0 0]
reading length = 3: [0 0 0]
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
reading length = 6: [1 34 7 0 0 0]
reading length = 1: [0] 
reading length = 0: []
reading length = 0: []
reading length = 2: [0 0]
reading length = 2: [0 0]
reading length = 1: [0]
这是第三次发送(我不知道这里发生了什么)

下面是实际的服务器读取代码

void Session::start(void) {
  msg_interface->add_msg_listener(this);
  _socket.async_read_some(
    boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH),
    boost::bind(&Session::handle_read, this, boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));
}

void Session::handle_read(const boost::system::error_code& error, std::size_t bytes_transferred) {
  if (error) {
    msg_interface->remove_msg_listener(this);
    delete this;
  } else {
    if (bytes_transferred != 0) {
      // print what we've received
      const int length = bytes_transferred / sizeof(uint16_t);
      std::cout << "reading length = " << length << ": [";
      for (int i = 0; i < length; i++) {
        const uint16_t data = ntohs(_read_data_buffer[i]);
        std::cout << data;
        if (i != length - 1) {
          std::cout << " ";
        }
      }
      std::cout << "]" << std::endl;
    }
    _socket.async_read_some(
      boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH),
      boost::bind(&Session::handle_read, this, boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
  }
}
有一件事-我使用相同的IO服务在收到消息时写入消息(服务器正在与旧接口通信,并将接收到的消息发送给所有客户端),以及从客户端读取消息。对两者使用相同的io服务会导致这种情况发生吗


我该怎么做才能解决这个问题呢?

你的代码做了它应该做的事情——它尽可能多地读取数据。这就是为什么函数名以“some”结尾——它读取“some”字节,并且不承诺做更多的事情。文件还说明了以下内容:

如果需要确保 在异步操作之前读取请求的数据量 完成


这似乎是你的情况,除非你重新工作你的接收器来处理部分读取。

好吧-我想我想知道的是,我需要读取3条不同长度的输入消息-有什么原因它只读取一定数量的信息,而不是读取完整的信息?另外-当我使用async_read时,它没有完全读取数据(14而不是15),然后消息变得不同步(正确读取的下一条消息的第一个字被附加到最后一条消息中-下一条消息缺少第一个字),我从来没有得到正确的消息-我也在本地主机上测试,所以我不明白为什么它会删除数据我也注意到,如果我每秒从客户端发送一次消息,它最终会同步并开始在服务器上正确读取-我真的不明白为什么会发生这种情况-然后每28或30条消息中就有一条消息会被它乘以256@seanchriste:TCP/IP,尤其是非阻塞读/写超出了注释的范围。我唯一能建议的就是买一些关于它的好书。你不应该能够发送或接收完整的消息,这是一个流协议…异步读取最终解决了它-我仍然不明白为什么使用异步读取会随机乘以它读取的数据(似乎它是沿着线路的某个位置移动位)-但async read最终解决了这个问题-我没有看到任何订购问题,谢谢,没问题。Async read some不是乘法。它从操作系统TCP/IP堆栈获取进程可用的数据量。有多少字节取决于MTU大小,取决于另一部分实际发送数据的方式(即nagle被启用或禁用)等。在这两种情况下,不要将这些数字视为“神奇”数字-假设没有。你看到的就是你得到的。
async\u read
所做的只是获取这些数据块,直到它有足够的字节,然后将这些数据以一个数据块的形式传递给您。因此,在引擎盖下,它在技术上没有任何用处。只是简化了你的生活。删除这个-在句柄中读取是错误的。