boost asio 写/读向量

M. *_* P. 3 c++ vector boost-asio

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

 std::vector<float> points;
Run Code Online (Sandbox Code Playgroud)

我用 boost asio write 发送它

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

在另一端我有:

std::vector<float> recv_vector;
tcp_socket.async_read_some(boost::asio::buffer(recv_vector), read_handler);
Run Code Online (Sandbox Code Playgroud)

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

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

马雷克

seh*_*ehe 6

Asio 不是序列化库。它不会序列化随机向量(您可以使用 Boost Serialization 来实现)。

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

std::vector<float> recv_vector;
tcp_socket.async_read_some(boost::asio::buffer(recv_vector), read_handler);
Run Code Online (Sandbox Code Playgroud)

您告诉它接收适合由空向量表示的 POD 缓冲区的数据量recv_vector。因此,你告诉 Asio 接收 0 字节,我认为它会为你高兴。

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

完整演示

我在这里有更多解释和完整示例:如何从套接字读取接收自定义数据类型?

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

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

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

boost::asio::write (socket, buffer(new_buffers->points));
Run Code Online (Sandbox Code Playgroud)