boost :: asio async_read保证读取所有字节

Ton*_*ion 6 c++ asynchronous boost-asio

我有一个服务器从客户端接收一个压缩字符串(用zlib压缩),我async_receiveboost::asio库中使用它来接收这个字符串,然而事实证明不能保证所有字节都将被接收,所以我现在有将其改为async_read.我面临的问题是接收的字节大小是可变的,所以我不知道如何在async_read不知道要接收的字节数的情况下使用.随着async_receive我只是有一个boost::array<char, 1024>,但是这是没有必要完全填满一个缓冲区.

我想知道是否有人可以建议我可以使用async_read的解决方案,即使我不知道提前收到的字节数?

void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler)
{
    if (!_queue_handler.get())
        _queue_handler = queue_handler;

    std::fill(buff.begin(), buff.end(), 0);

    //socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
    boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
}
Run Code Online (Sandbox Code Playgroud)

buff 是一个 boost::array<char, 1024>

Pet*_*org 20

您是如何期望使用任何其他方法执行此操作的?

在异步庄园中发送可变大小的数据有一些通用方法:

  1. 通过消息 - 意味着您有一个标题,用于定义预期消息的长度,后跟包含指定长度数据的正文.
  2. 通过流 - 意味着你有一些标记(这是非常广泛的)的方法,知道你什么时候得到一个完整的数据包.
  3. 通过连接 - 每个完整的数据包都在一个连接中发送,一旦数据完成就关闭.

那么您的数据可以被解析,还是发送长度等...

  • 一些可能的解决方案+1很好的总结 (4认同)