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(),它总是空的。
有人可以告诉我我做错了什么吗?
马雷克
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)