提升asio写/读矢量

时间:2017-04-27 11:55:41

标签: c++ vector boost-asio

我无法从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 个答案:

答案 0 :(得分:2)

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));