我正在使用boost 1.53和序列化来通过TCP / IP传输520个浮点数组。我把一个调试代码打印输出来查看要发送的数据量:它大约是5 K.这里对我来说没问题,但这个值在某种程度上取决于要序列化的实际数据。它可能是5400,5500等等。
问题是:接收此类数据块的正确方法是什么?目前我使用read_some()
电话。但正如我所知,它并不能保证读出整个序列化数据块。我错了吗?
如何确保RX端有完整的存档?当无法反序列化一大块数据时,是否会抛出任何异常?
答案 0 :(得分:2)
至于tcpip数据包可以接收到一些较小的数据包,所以我建议添加一些额外的数据到tcpip 像这样的东西:
接收器读取大小,然后读取数据包的其余部分。
收到完整数据包后 - 调用反序列化
答案 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
字节读取:)