使用Boost :: asio接收压缩数据

时间:2011-02-02 10:34:49

标签: c++ sockets boost boost-asio compression

我有一个客户端使用此功能向我发送数据:

void CServerRetrieve::Send(char *buf, DWORD size, int flags)
{
    unsigned char *zlib;
    unsigned long szzlib;
    m_zlib.Deflate((unsigned char*)buf, size + 1, &zlib, &szzlib); // include the terminating 0 char
    char zbuf[5];
    zbuf[0] = 'Z';
    memcpy(&zbuf[1], &szzlib, 4);
    send(m_Socket, zbuf, 5, flags);
    send(m_Socket, (char*)zlib, szzlib, flags);
    delete [] zlib;
}

我想使用Boost :: asio接收这些数据,但是我不确定应该将哪种类型的缓冲区传递给socket.async_receive以便它接收这些数据?

我尝试了std::vector<char>std::vector<std::string>,但我的缓冲区中没有收到任何数据?

有人可以帮助我解决我做错的事吗?

void tcp_connection::start()
{
    socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void tcp_connection::handle_read(const boost::system::error_code& err, size_t bytes_transferred)
{
    if (!err || err ==  boost::asio::error::message_size)
    {
        size_t sz = buff.size(); //always 0!
    }
}

2 个答案:

答案 0 :(得分:1)

您正在接收压缩数据这一事实对Boost.Asio无关紧要。假设您知道要接收的数据大小,std::vector<char>可以接收压缩数据。在调用resize之前,您需要async_receive它只是确保在调用完成处理程序之前,此缓冲区不会超出范围。这个概念在async_read documentation中解释。

  

<强>缓冲器

     

将要读取数据的一个或多个缓冲区。总和   缓冲区大小表示   要读取的最大字节数   流。虽然是缓冲区   可以根据需要复制对象,   底层内存的所有权   块被调用者保留,   必须保证它们仍然存在   在调用处理程序之前有效

答案 1 :(得分:0)

我假设buff是你的std :: vector?在这种情况下,在async_receive之前,您应该使用您想要读取的大小初始化它,例如

buff.resize(5);

如果您知道要接收的邮件大小,也应该考虑使用async_read。在任何情况下,您都需要为缓冲区设置大小。