Проблема с закачкой HTML
Моя программа закачивает HTML с некоторых сайтов для последующей обработки.
Качаю так:
CInternetSession* pInternetSession;
CString BrName="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
pInternetSession = new CInternetSession(BrName);
CString strb,HTML;
strb="";
HTML="";
CStdioFile* pFile = NULL;
try
{
pFile = pInternetSession->OpenURL(link,1,INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE);
try
{
while (pFile->ReadString(strb))
{
HTML=HTML+strb;
}
} //end try
catch (CFileException* e)
{
CString mes="Не удалось прочитать файл";
AfxMessageBox(mes);
return ("Error");
}
}
pFile->Close();
pInternetSession->Close();
delete buffer;
delete pInternetSession;
return HTML;
} // end try
catch (CInternetException* e)
{
CString mes="Не удалось открыть URL:";
AfxMessageBox(mes,MB_OK);
return ("Error");
}
Практически все сайты качаются без проблем, но есть пара сайтов на которых этот код скачивает несколько страниц и виснет, помагает только перезапуск программы. Причем виснет не на конкретных страницах, а случайным образом. В принципе эти сайты и в эксплорере плохо открываются. Я понимаю что это проблема конкрентных сайтов, но нехотелось бы что бы программа просто зависала. Необходио как то отловить эту ситуацию, что бы например, прервать закачку и начать заново. Как это можно сделать?
Цитата: yaga
Практически все сайты качаются без проблем, но есть пара сайтов на которых этот код скачивает несколько страниц и виснет, помагает только перезапуск программы. Причем виснет не на конкретных страницах, а случайным образом. В принципе эти сайты и в эксплорере плохо открываются.
А можно привести адреса этих сайтов? Ну, чтобы попробовать.
Цитата: yaga
но нехотелось бы что бы программа просто зависала. Необходио как то отловить эту ситуацию, что бы например, прервать закачку и начать заново. Как это можно сделать?
Ну, может помочь такая идея. Можно запускать код для скачивания HTML-страниц в новом потоке, при этом основной поток должен проверять время скачивания, и если оно превышает некоторое значение (timeout, задаете сами) убивать порожденный поток, ну и, например, предлагать закачать страницу заново.
P.S. В MSDN для функции ReadString() есть такое замечание:
Цитата:
Reading is stopped by the first newline character.
При этом, если страница оптимизирована каким-то HTML-оптимизатором, там вообще может не быть символов завершения строки. Может в этом пооблема?
ну и Callback функции, для WinInet.
всё это описано в MSDN
После долгих эксперементов выяснилось, что таймоуты не помогают, программа все равно виснит.
Еще выяснилось что это происходит только у меня дома. На работе и у моих друзей программа качает безупречно. Впрочем, и на домашнем компьютере ночью качает нормально. Вообщем, грешу на провайдера.
В любом случае, такое поведение программы считаю неправильным, поэтому сдела как советовал magfed.