Я разрабатываю систему для нашего приложения для получения данных с внешнего устройства.Как только я отправляю ему конкретное сообщение, он отправляет нам короткие сообщения со скоростью 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.