Boost Asio 写入/读取向量。

3

我有问题从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()时,它总是为空。

有人可以告诉我哪里出了问题吗?

Marek

1个回答

6

Asio不是一个序列化库。它不会对随机向量进行“序列化”(你可以使用Boost Serialization来实现这一点)。

它只是将你的缓冲区视为IO操作的数据缓冲区。因此,在第二个示例中:

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

您需要告诉Asio接收适合由向量recv_vector表示的POD缓冲区中的数据量,该向量为空。因此,您要求Asio接收0字节,我认为它会愉快地为您完成。
为了解决问题,可以使用序列化(将责任放在另一个库的手中)或在实际数据之前手动发送向量的大小。
完整演示:
我在这里有更多解释和完整示例:如何从套接字读取自定义数据类型? 还要注意,您不必做那么复杂的事情:
boost::asio::write (socket, boost::asio::buffer(&new_buffers->points.front(), nr_points * 3 * sizeof (float)));

相反,对于POD类型的向量,只需让Asio进行计算和转换

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

谢谢,这正是我需要知道的。 - M. P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接