我正在为我们的应用程序开发一个系统,以从外部设备获取数据。当我向其发送特定消息时,它会以每秒10倍的速度向我们发送回短消息(因此,每100毫秒大约发送1条消息)。我正在使用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());
不会编译。错误是“无法解析方法'数据'”。 mutable_buffer_1
API表示data()是一种完全有效的方法,可返回内存范围的开头。
通过调试器进行检查,可以看到没有错误,并且可以看到data
是_data_buffer
的成员,并且其中包含的内存地址确实包含了我们期望的数据。关键是,我无法通过代码来实现。有人知道如何在Boost mutable_buffers_1
中获取数据吗?
我们正在使用在Linux上运行的Eclipse CDT,C ++ 11和gcc。
答案 0 :(得分:1)
“方法'数据'无法解析”。
此错误可能是正确的,但这取决于您使用的Boost版本。自{= 1.66起,data()
是mutable_buffer
的成员。因为mutable_buffer
是mutable_buffers_1
的基类,所以如果至少使用1.66版本的Boost,则应编译代码。
如果您的版本是<1.66,则应使用
char* p1 = boost::asio::buffer_cast<char*>(_data_buffer);
获取指向缓冲区中数据的指针。
_data_buffer.begin();
您不应使用begin()
方法,它会返回指向mutable_buffer_1
本身的指针。此方法由asio-boost库的内部函数使用,例如用于复制缓冲区序列,然后begin()
指向要复制的特定缓冲区。