Сервер Web своими руками. Язык HTML, приложения CGI и ISAPI




Приложение FILEUPL - часть 11


memcpy(lpTemp, lpECB->lpbData, lpECB->cbAvailable);

Напомним, что размер этого буфера не превышает 48 Кбайт. Буфер предварительного чтения располагается по адресу lpECB->lpbData и в нем доступно для чтения lpECB->cbAvailable байт данных.

Так как размеры передаваемого файла могут легко превысить предел 48 Кбайт, необходимо организовать цикл чтения остальных данных с помощью функции ReadClient.

Перед запуском такого цикла мы устанавливаем указатель текущей позиции в буфере lpTemp на конец блока данных, скопированных из буфера предварительного чтения:

nBufferPos = lpECB->cbAvailable;

Далее мы определяем размер данных, которые не поместились в буфере предварительного чтения и которые нужно дочитать дополнительно. Очевидно, для этого нужно вычесть из полного размера данных размер данных, записанных в буфер предварительного чтения:

nBytesToCopy = lpECB->cbTotalBytes - lpECB->cbAvailable;

После проверки значения nBytesToCopy (оно должно быть больше нуля) мы запускаем цикл чтения дополнительных данных:

while(1)

{

  // Читаем очередную порцию данных в текущую

  // позицию буфера

  lpECB->ReadClient(lpECB->ConnID,

    (LPVOID)((LPSTR)lpTemp + nBufferPos), &cbReaded);

             

  // Уменьшаем содержимое переменной nBytesToCopy,

  // в которой находится размер непрочитанных данных

  nBytesToCopy -= cbReaded;

  // Продвигаем указатель текущей позиции в буфере

  // на количество прочитанных байт данных

  nBufferPos   += cbReaded;

             

  // Когда копировать больше нечего, прерываем цикл

  if(nBytesToCopy <= 0l)

    break;

}

В этом цикле вызывается функция ReadClient, причем в качестве адреса, по которому она должна записать принятые данные, ей указывается адрес буфера lpTemp со смещением на текущую позицию nBufferPos. При первом проходе цикла это смещение соответствует концу области данных, скопированных из буфера предварительного чтения.

Функция ReadClient не обязательно прочитает за один прием все входные данные. Размер прочитанного ей блока данных записывается в переменную cbReaded.




Содержание  Назад  Вперед