【问题标题】:boost asio write/read vectorboost asio 写/读向量
【发布时间】:2017-04-27 11:55:41
【问题描述】:

我无法从 boost asio 缓冲区读取向量。 我有这个向量:

 std::vector<float> points;

我用 boost asio write 发送它

  boost::asio::write (socket, boost::asio::buffer(&new_buffers->points.front(), nr_points * 3 * sizeof (float)));

在另一端我有:

std::vector<float> recv_vector;
tcp_socket.async_read_some(boost::asio::buffer(recv_vector), read_handler);

当我做recv_vector.size() 时,它总是空的。

谁能告诉我我做错了什么?

马雷克

【问题讨论】:

    标签: c++ vector boost-asio


    【解决方案1】:

    Asio 不是序列化库。它不会序列化随机向量(您可以为此使用 Boost 序列化)。

    它只是将您的缓冲区视为 IO 操作的数据缓冲区。所以,例如第二种情况:

    std::vector<float> recv_vector;
    tcp_socket.async_read_some(boost::asio::buffer(recv_vector), read_handler);
    

    您告诉它接收适合向量recv_vector 表示的POD 缓冲区的数据量,该向量为空。因此,您告诉 Asio 接收 0 个字节,我认为它会为您带来快乐。

    要解决问题,要么使用序列化(将责任交给另一个库),要么在实际数据之前手动发送向量的大小。

    完整演示

    我在这里有更多解释和完整示例:How to receive a custom data type from socket read?

    另外请注意,您不必做那么复杂的事情:

    boost::asio::write (socket, boost::asio::buffer(&new_buffers->points.front(), nr_points * 3 * sizeof (float)));
    

    相反,对于 POD 类型向量,只需 let Asio do the calculations and casts

    boost::asio::write (socket, buffer(new_buffers->points));
    

    【讨论】:

    • 谢谢,正是我需要知道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多