Засылка файлов
От: Zoom Россия  
Дата: 02.11.04 13:05
Оценка:
Проблема. В ISAPI при пересылке данных методом multipart/form-data 48 КБ информации можно принять след образом: pCtxt->m_pECB->lpbData где pCtxt — объект класса CHttpServerContext.

Остальную информацию нужно считывать с помощью метода pCtxt->ReadClient(<адрес буфера>, <размер буфера>).
Так вот у меня при посылке файла размером 119 Кб он не хочет считывать оставшиеся 119-48=71 Кб. Просто функция ReadClient зависает. В МСДН написано, что такое м.б. только если я запросил больше информации чем там есть. Но я указывал размер буфера и 4096 б и 1024 б и 8 б — один хрен — не хочет читать и все!!!!
В чем косяк???? Подскажите пожалуйста. Заранее благодарен.

02.11.04 17:11: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Засылка файлов
От: Arthur-V  
Дата: 13.01.05 13:01
Оценка:
хех)) та же фигня, только у меня не зависает,а дает ошибку 10054 — соединение было порвано на другом конце..

на другом конце у меня тоже висит своя прога, вот я и думаю, что я еще должен сделать такое чтобы не прерывалось... на том конце получаю HTTP/1.1 100 Continue, и IIS рвет коннект...

ничего не пойму..

Люди помогите нам, заблудшим в дебри ISAPI)))))
Re[2]: Засылка файлов
От: Arthur-V  
Дата: 13.01.05 15:41
Оценка:
Урррааа!! )))))

У меня получилось, надесюь нижеприведенный код кому-нидь поможет.
Во-первых, дочитываем ReadClient то что осталось
Во-вторых, при отсылке контролируем приход HTTP/1.1 200 OK, это нужно чтобы
убедиться что все стадии по приему (см.выше) файла были пройдены.
В-третьих, нельзя тестироваться на локальном веб-сервиса, IIS почему-то не шлет 200 ОК

от так от %)

//---- скопируем то, что уже есть
   memcpy(buf,pECB->lpbData,pECB->cbAvailable);
   blen=pECB->cbAvailable;
   buf[blen]=0;
//---- если нужно дочитаем остаток файла
   while(blen<pECB->cbTotalBytes)
     {
      rcnt=(pECB->cbTotalBytes)-blen;
      //---- попытка чтения
      if(pECB->ReadClient(pECB->ConnID,buf+blen,&rcnt)==FALSE)
        {
         ExtLogger.Out("'%s': crashlogs: failed to read datastream (err %d)",ip,GetLastError());
         delete[] buf;
         return;
        }
      //---- увеличим счетчик на реально считанное кол-во байт
      blen+=rcnt;
      buf[blen]=0;
     }
//---- вот теперь проверим наличие баундера
   if((cp=strstr((char*)buf,"\r\n---4385ufgbart---"))==NULL)
     {
      ExtLogger.Out("'%s': crashlogs: invalid bound",ip);
      delete[] buf;
      return;
     }
   *cp=0;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.