Проблема. В 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++' — Павел Кузнецов
хех)) та же фигня, только у меня не зависает,а дает ошибку 10054 — соединение было порвано на другом конце..
на другом конце у меня тоже висит своя прога, вот я и думаю, что я еще должен сделать такое чтобы не прерывалось... на том конце получаю HTTP/1.1 100 Continue, и IIS рвет коннект...
ничего не пойму..
Люди помогите нам, заблудшим в дебри ISAPI)))))
Урррааа!!

)))))
У меня получилось, надесюь нижеприведенный код кому-нидь поможет.
Во-первых, дочитываем 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;