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