как узнать размер стола - PullRequest
       15

как узнать размер стола

0 голосов
/ 08 апреля 2019

Я получаю объекты плоских буферов из сети, я использую буферы с префиксом размера, как предлагается в документации. Я делаю проверку перед тем, как разобрать данные. Проблема в том, как узнать размер буфера, который я должен проверить?

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 размер одного буфера сообщений. Есть ли как-нибудь это сделать?

1 Ответ

1 голос
/ 08 апреля 2019

Вы должны как-то уведомить получателя, что отправка буфера завершена, и вы должны сделать это вручную.

Если вы используете подход с буфером с префиксом размера, то размер буфера должен быть отправлен получателю данных в первых байтах буфера. Когда первая часть буфера получена, получатель должен прочитать размер данных из первых байтов полученного буфера и делать 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 и другие детали реализации.

...