Как прочитать пакет в boost :: asio - PullRequest
1 голос
/ 04 декабря 2010

как мне прочитать пакет в boost :: asio, например, 0x01, текущий код, который я имею, читает только тексты:

   m_socket.async_read_some(boost::asio::buffer(buffer),
       strand.wrap(boost::bind(&Client::handleRead, shared_from_this(),
       boost::asio::placeholders::error,
       boost::asio::placeholders::bytes_transferred)));

спасибо

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Привет, вы можете назначить буфер вашей переменной int, а затем использовать значение, которое вы читаете из сокета

int m_hdr_size = 0; // this var must be not local

boost::asio::async_read_some(
boost::asio::buffer(reinterpret_cast<char*>(&m_hdr_size), size_t(4))...

если я понимаю твой вопрос. Просто установите переменную и ее размер в буфер

http://think -async.com / ASIO / boost_asio_1_3_1 / DOC / HTML / boost_asio / ссылка / buffer.html

0 голосов
/ 20 февраля 2012

Сомневаюсь, что вам нужен этот ответ год спустя, но для широкой публики:

В вашем коде буфер передается по ссылке.Это так, что когда asio асинхронно вызывает ваш обработчик чтения (Client::handleRead), он обновляет содержимое этого буфера до того, что получит.

Буфер - это просто массив с указанным размером.Asio не будет заполнять буфер после размера, указанного вами в boost::asio::buffer(ptr, size), поэтому, если вам нужно 32-разрядное целое число, передайте ему указатель на начало массива с размером = 4 байта, а затем приведите его к 32-бит int (вероятно, uint32_t из stdint.h), когда он вызывает обработчик чтения.

Обычно вы можете сохранить хороший кусок памяти, передавая 16 или 8 бит, когда вам не нужен весь32-битное целое число.uint8_t и uint16_t позволят вам сделать это, не беспокоясь о том, не является ли int вашей архитектуры 32-битным.

...