Получать сжатые данные, используя Boost :: asio - PullRequest
1 голос
/ 02 февраля 2011

У меня есть клиент, который отправляет мне данные, используя эту функцию:

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 ]

1 голос
/ 02 февраля 2011

Тот факт, что вы получаете сжатые данные, действительно не имеет значения для Boost.Asio. Предполагая, что вы знаете размер данных, которые вы собираетесь получить, std::vector<char> отлично подходит для получения сжатых данных. Вам потребуется resize до вызова async_receive Просто убедитесь, что этот буфер не выходит из области видимости, пока не будет вызван обработчик завершения. Эта концепция объясняется в документации async_read .

буферы

Один или несколько буферов, в которые будут считываться данные. Сумма размеров буфера указывает на максимальное количество байтов для чтения поток. Хотя буферы объект может быть скопирован по мере необходимости, владение основной памятью блоки сохраняются вызывающей стороной, который должен гарантировать, что они остаются действует до тех пор, пока обработчик не будет вызван .

0 голосов
/ 02 февраля 2011

Я предполагаю, что бафф - это ваш std :: vector? В этом случае перед async_receive вам, вероятно, следует инициализировать его с размером, который вы намереваетесь прочитать, например

buff.resize(5);

Вам также следует рассмотреть возможность использования async_read, если вы знаете размер сообщения, которое собираетесь получить. В любом случае вам нужно установить размер буфера.

...