c++ - 提升 asio 写/读 vector

标签 c++ vector boost-asio

我无法从 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/

相关文章:

c++ - 这种 nullptr 的使用是否会产生编译器错误?

c++ - 如果声明无效

c++ - 错误 C2039 : 'find' : is not a member of 'std'

c++ - boost asio 绑定(bind)端点

c++ - 这个指针是右值吗?

c++ - 自动驱动器格式化?

c++ - 包含结构的 vector 的 vector

c++ - static const的C++容器初始化列表导致栈溢出

c++ - boost asio 原始套接字

c++ - 进行异步调用后删除 asio 套接字