Поместите чтение как часть условия while.
while((remainingSize > 0) && (count = read(connect_fd, iter, remainingSize)) > 0)
{
iter += count;
remainingSize -= count;
}
Таким образом, в случае неудачи вы немедленно останавливаете цикл.
Это очень распространенный способ использовать чтение как часть условия цикла, в противном случае вам нужно проверить состояние внутри цикла, что делает код более уродливым.
Лично:
Я бы переместил весь вышеописанный тест в отдельную функцию для удобства чтения, но ваш пробег может быть очень большим.
Также использование malloc (и компании) приведет к целому ряду проблем управления памятью. Я бы использовал std :: vector. Это также в будущем подтверждает код, когда вы измените его, чтобы начать генерировать исключения, теперь он также будет безопасным для исключений.
Итак, если вы измените data.data, чтобы иметь тип std :: vector затем
if ( data.size > 0 )
{
std::vector<unsigned char> buffer(data.size);
unsigned char *iter = &buffer[0];
while(... read(connect_fd, iter, remainingSize) )
{
.....
}
... handle error as required
buffer.resize(buffer.size() - remainingSize);
data.data.swap(buffer);
}