我无法从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()
时,它始终为空。
有人可以告诉我我做错了吗?
马立克
答案 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));