Как получить данные из Boost mutable_buffers_1? - PullRequest
0 голосов
/ 10 октября 2018

Я разрабатываю систему для нашего приложения для получения данных с внешнего устройства.Как только я отправляю ему конкретное сообщение, он отправляет нам короткие сообщения со скоростью 10 раз в секунду (примерно 1 сообщение в 100 миллисекунд).Я использую Boost для этого общения.

Процесс довольно прост: я создаю сокет, отправляю сообщение, предоставляю ему обработчик для получения сообщения:

// Header file:
...
std::unique_ptr<boost::asio::io_service> _theIOService;
std::unique_ptr<boost::asio::ip::tcp::socket> _theSocket;
int size_of_the_data = 100;
std::vector<char> _raw_buffer = std::vector<char>(size_of_the_data);
boost::asio::mutable_buffers_1 _data_buffer = boost::asio::buffer(_raw_buffer, size_of_the_data);
...

// Implementation file:

...
void DeviceDataListener::initiateTransfer() {

    // create and connect the socket up here
    ...
    // send the message
    boost::system::error_code error;
    boost::asio::write(*_theSocket,
                        boost::asio::buffer(beginMessage),
                        boost::asio::transfer_all(), error);

    // start the receive
    auto handler = boost::bind(&SCUDataListener::dataHandler, this, _1, _2);
    _theSocket->async_receive( _data_buffer, handler );
    std::thread run_thread([&]{ _theIOService->run(); });
    ...
}

void DeviceDataListener::dataHandler (
    const boost::system::error_code& error, // Result of operation.
    std::size_t bytes_transferred           // Number of bytes received.
    ) {

    int foo = bytes_transferred;

    // this line crashes application
    char* pData = static_cast<char*>(_data_buffer.data());
}

Работаетмой обработчик вызывается немедленно, как и должно.Проблема в том, что я не могу получить данные из _data_buffer.Это:

auto it = _data_buffer.begin();

вызывает сбой, даже если _data_buffer допустимо.Это:

const char* pData = static_cast<char*>(_data_buffer.data());

не скомпилируется.Ошибка «Метод« данные »не может быть разрешен».API mutable_buffer_1 говорит, что data () - это полностью допустимый метод, который возвращает начало диапазона памяти.

При проверке с помощью отладчика я вижу, что ошибки нет, и я вижу data какчлен _data_buffer и адрес памяти, который он содержит, содержат данные, которые мы ожидаем.Дело в том, что я не могу добраться до него с помощью кода.Кто-нибудь знает, как получить данные в Boost mutable_buffers_1?

Мы используем Eclipse CDT, C ++ 11 и gcc, работающие в Linux.

1 Ответ

0 голосов
/ 10 октября 2018

«Метод« данные »не может быть разрешен».

эта ошибка может быть истинной, но это зависит от того, какую версию Boost вы используете.data() является членом mutable_buffer, поскольку версия> = 1.66.Поскольку mutable_buffer является базовым классом для mutable_buffers_1, ваш код должен компилироваться, если вы используете версию Boost не менее 1.66.

Если ваша версия <1.66, вы должны использовать </p>

 char* p1 = boost::asio::buffer_cast<char*>(_data_buffer);

чтобы получить указатель на данные в буфере.


_data_buffer.begin();

Вы не должны использовать метод begin(), он возвращает указатель на mutable_buffer_1.Этот метод используется внутренними функциями библиотеки asio-boost, например, для копирования последовательности буферов, тогда begin() указывает конкретный буфер для копирования.

...