如何获取表格的大小

how to get table's size

本文关键字:表格 获取 何获取      更新时间:2023-10-16

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

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);

由于从网络接收的缓冲区可以是任何大小,因此它可以是平面缓冲区的一半或两个缓冲区,但我需要为 Verifier 提供一个消息缓冲区的大小。有没有办法这样做?

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

如果使用以大小为前缀的缓冲区方法,则必须在缓冲区的第一个字节中将缓冲区的大小发送到数据接收器。当收到第一个缓冲区部分时,接收方应从接收缓冲区的第一个字节读取数据大小,并执行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类型和其他实现细节。