TCP отправляет данные по частям, поэтому вы не гарантированно получите их все сразу за одно чтение (хотя гарантированно останетесь в том порядке, в котором вы их отправили). Вы в основном должны читать несколько раз, пока не получите все данные. Он также не знает, сколько данных вы отправили на стороне получателя. Обычно вы отправляете поле фиксированной длины «длина» вначале (например, всегда 8 байт), чтобы вы знали, сколько там данных. Затем вы продолжаете читать и строить буфер, пока не получите столько байтов.
Таким образом, отправитель будет выглядеть примерно так (псевдокод)
int imageLength;
char *imageData;
// set imageLength and imageData
send(&imageLength, sizeof(int));
send(imageData, imageLength);
И получатель будет выглядеть так (псевдокод)
int imageLength;
char *imageData;
guaranteed_read(&imageLength, sizeof(int));
imageData = new char[imageLength];
guaranteed_read(imageData, imageLength);
void guaranteed_read(char* destBuf, int length)
{
int totalRead=0, numRead;
while(totalRead < length)
{
int remaining = length - totalRead;
numRead = read(&destBuf[totalRead], remaining);
if(numRead > 0)
{
totalRead += numRead;
}
else
{
// error reading from socket
}
}
}
Очевидно, что я остановил фактический дескриптор сокета, и вам нужно добавить множество проверок ошибок ко всему этому. Это не должно было быть полным, чтобы показать идею.