提升序列化:确保套接字传输的数据安全性

时间:2013-12-09 14:01:20

标签: c++ serialization boost

我正在使用boost 1.53和序列化来通过TCP / IP传输520个浮点数组。我把一个调试代码打印输出来查看要发送的数据量:它大约是5 K.这里对我来说没问题,但这个值在某种程度上取决于要序列化的实际数据。它可能是5400,5500等等。

问题是:接收此类数据块的正确方法是什么?目前我使用read_some()电话。但正如我所知,它并不能保证读出整个序列化数据块。我错了吗?

如何确保RX端有完整的存档?当无法反序列化一大块数据时,是否会抛出任何异常?

2 个答案:

答案 0 :(得分:2)

至于tcpip数据包可以接收到一些较小的数据包,所以我建议添加一些额外的数据到tcpip 像这样的东西:

  1. 序列化您的数据流
  2. 获取流的大小
  3. 从流的大小开始发送到tcpip缓冲区,然后从流
  4. 发送数据

    接收器读取大小,然后读取数据包的其余部分。

    收到完整数据包后 - 调用反序列化

答案 1 :(得分:1)

是。 read_some可能是符合实现 [1] 的无操作。

而是使用read()gcount()进行循环,例如:

std::istream& is = gotten_from_somewhere_or_a_parameter();

std::vector<byte> v(256);
std::streamsize bytes_read;
do
{
    is.read(v.data(),v.size());
    bytes_read = stream.gcount ();

    // do something with the bytes read
} while(bytes_read);

[1] 值得注意的是,gcc的标准库实现似乎总是返回std::filebuf的内容,但在MSVC上,第一次调用将始终返回0字节读取:)