如何获取表格的大小
how to get table's size
我正在从网络接收平面缓冲区对象,我正在使用文档建议的大小前缀缓冲区。在实际解散数据之前,我正在进行验证。问题是我怎么知道我应该验证缓冲区的大小?
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
类型和其他实现细节。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- 用libcurl填写帖子表格并获取最终网址
- 如何获取表格的大小