О.Смешная арифметика массива.Идея состоит в том, чтобы считать с конца, чтобы, когда вы дойдете до конца, вы знали, что все готово.В кусочках:
1. Найдите адрес dataLength (BYTE*)(&dataLength)
2. Перейдите к концу dataLength + sizeof(dataLength)
3. Вернитесь на количество байтов, которое мы ожидаем получить - cbLeftToReceive
Здесь мы записываем байты, которые мы получаем из сети.
Получая байты из сети, мы уменьшаем cbLeftToReceive (cbLeftToReceive -= cbBytesRet;
) и продолжаем пытаться получать байты до тех пор, пока не закончим.Таким образом, каждый раз в цикле bp указывает, куда нам нужно записать следующие байты, которые мы получаем ().
РЕДАКТИРОВАТЬ:
Итак, теперь мы знаем, сколько байтов мы собираемсяполучить, как мы можем получить их, не заполняя все ОЗУ кусками данных?Мы получаем буфер, повторно заполняем его и сбрасываем этот буфер на диск всякий раз, когда он не пустой.Когда осталось еще много данных (больше, чем буфер) для получения, мы пытаемся получить () заполнить буфер.Когда осталось меньше полного буфера, мы запрашиваем только конец файла.
iiGet = (cbLeftToReceive<RECV_BUFFER_SIZE) ?
cbLeftToReceive : RECV_BUFFER_SIZE ;
iiRecd = sockClient.Receive( recdData, iiGet );
Мы отлавливаем и обрабатываем ошибки.Если ошибки не было, запишите столько байтов, сколько мы получили, и уменьшите количество байтов, которое мы ожидаем получить, на число, которое мы получили.
destFile.Write( recdData, iiRecd); // Write it
cbLeftToReceive -= iiRecd;
Если мы еще не закончили получать байты, вернитесь ки продолжайте.
while ( cbLeftToReceive > 0 );
Общие советы: Хорошо практиковаться в чтении кода, когда вы не обращаете слишком много внимания на обработку ошибок и код обработки исключений.Как правило, то, что осталось, гораздо легче понять.