c++ - 如何获取表的大小
问题描述
我正在从网络接收平面缓冲区对象,我正在使用文档建议的大小前缀缓冲区。在实际解组数据之前,我正在做验证。问题是我怎么知道我应该验证什么大小的缓冲区?
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);
由于从网络接收的缓冲区可以是任何大小,它可以是平面缓冲区的一半或两个缓冲区,但我需要给验证程序一个消息缓冲区的大小。有没有办法做到这一点?
解决方案
您必须以某种方式通知接收方,缓冲区发送已完成,您应该手动执行此操作。
如果使用大小前缀缓冲区的方法,那么缓冲区的大小必须在缓冲区的第一个字节中发送给数据接收器。当接收到第一个缓冲区部分时,接收器应该从接收到的缓冲区的第一个字节中读取数据大小,并一直执行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
类型和其他实现细节。
推荐阅读
- reactjs - 使用离子+反应时的路线守卫
- unicode - 为什么Byte level BPE的vocab size小于Unicode的vocab size?
- android - 音频声音未在 Android 中播放
- android - 必须 onCreateOptionsMenu 成为每个活动的实现吗?
- javascript - Discord.js 在一条消息中发送多个附件
- java - 为什么我的按钮组不起作用和显示?
- javascript - 我如何知道在按钮类中单击了哪个按钮?
- yaml - 试图在 Cygwin 中保存 yml 对象
- mysql - 为链接的一对多关系插入查询
- python - 有两个输入的石头、纸、剪刀游戏