首页 > 解决方案 > 如何获取表的大小

问题描述

我正在从网络接收平面缓冲区对象,我正在使用文档建议的大小前缀缓冲区。在实际解组数据之前,我正在做验证。问题是我怎么知道我应该验证什么大小的缓冲区?

buff = recv(sock);
Verifier v(buff.data(), ???); // buffer could be half of a buffer or two buffers, what should I supply to the 2nd argument to Verifier?
bool f = VerifySizePrefixedMessageBuffer(v);

由于从网络接收的缓冲区可以是任何大小,它可以是平面缓冲区的一半或两个缓冲区,但我需要给验证程序一个消息缓冲区的大小。有没有办法做到这一点?

标签: c++serializationflatbuffers

解决方案


您必须以某种方式通知接收方,缓冲区发送已完成,您应该手动执行此操作。

如果使用大小前缀缓冲区的方法,那么缓冲区的大小必须在缓冲区的第一个字节中发送给数据接收器。当接收到第一个缓冲区部分时,接收器应该从接收到的缓冲区的第一个字节中读取数据大小,并一直执行recv()直到所有数据都传输完毕(直到所有接收到的缓冲区部分大小的总和等于发送缓冲区的总大小,您从第一个收到的缓冲区部分就已经知道了)。

在接收方,它应该如下所示:

buff = recv(sock);
uint32_t received = buff.size();
auto totalBuff = buff;
// I assume you have 4 bytes for unsigned integer buffer size prefix
while (received < 4) { // receive whole buffer size prefix data
    buff = recv(sock);
    received += buff.size();
    // append new data to total data buffer
    totalBuff.insert(totalBuff.end(), buff.begin(), buff.end());
}
uint32_t totalSize = *(reinterpret_cast<uint32_t>(totalBuff.data()); 
while (received < totalSize) {
    buff = recv(sock);
    received += buff.size();
    // append new data to total data buffer
    totalBuff.insert(totalBuff.end(), buff.begin(), buff.end());
}

// do whole buffer data processing 
ProcessSizePrefixedBuffer(totalBuff);

在此totalBuff数据大小将在缓冲区的前 4 个字节中。这是比工作代码更多的伪代码,因为我不知道您的实际buff类型和其他实现细节。


推荐阅读