我无法从 boost asio 缓冲区读取 vector 。 我有这个 vector :
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()
时,它总是空的。
谁能告诉我我做错了什么?
马立克
最佳答案
Asio 不是序列化库。它不会序列化随机 vector (您可以为此使用 Boost 序列化)。
它只是将您的缓冲区视为 IO 操作的数据缓冲区。所以,例如在第二种情况下:
std::vector<float> recv_vector;
tcp_socket.async_read_some(boost::asio::buffer(recv_vector), read_handler);
您告诉它接收适合 POD 缓冲区的数据量,该缓冲区由 vector recv_vector
表示,它是空的。因此,您告诉 Asio 接收 0 个字节,我认为它会很乐意为您完成。
要解决问题,请使用序列化(将责任交给另一个库)或在实际数据之前手动发送 vector 的大小。
完整演示
我在这里有更多的解释和完整的示例: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 类型的 vector ,只需 let Asio do the calculations and casts :
boost::asio::write (socket, buffer(new_buffers->points));
关于c++ - 提升 asio 写/读 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43657070/