如何从Boost mutable_buffers_1中获取数据?

时间:2018-10-10 16:37:08

标签: c++11 boost-asio

我正在为我们的应用程序开发一个系统,以从外部设备获取数据。当我向其发送特定消息时,它会以每秒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。

1 个答案:

答案 0 :(得分:1)

  

“方法'数据'无法解析”。

此错误可能是正确的,但这取决于您使用的Boost版本。自{= 1.66起,data()mutable_buffer的成员。因为mutable_buffermutable_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()指向要复制的特定缓冲区。