首页 文章

提升asio写/读矢量

提问于
浏览
1

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

std::vector<float> points;

我发送它与提升asio写

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() 时,它总是空着的 .

有人能告诉我我做错了什么吗?

马雷克

1 回答

  • 2

    Asio不是序列化库 . 它没有序列化随机向量(你可以使用Boost Serialization) .

    它只是将缓冲区视为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));
    

相关问题