Здравствуйте! есть скрипт, содержание (результат) которого постоянно меняется. есть функция: Код (Text): int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize) { HINTERNET hInternet; HINTERNET hConnect; HINTERNET hRequest; DWORD dwBytesRead; BOOL bSend; BOOL bRead; hInternet = InternetOpen("Open",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL); if (hInternet != NULL) { hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1u); if (hConnect != NULL) { hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,1); if (hRequest != NULL) { bSend = HttpSendRequest(hRequest,NULL,0,NULL,0); if (bSend) for(;;) { bRead = InternetReadFile(hRequest,szData,DataSize-1,&dwBytesRead); if (bRead == FALSE || dwBytesRead == 0) break; szData[dwBytesRead]=0; } } InternetCloseHandle (hRequest); } InternetCloseHandle (hConnect); } InternetCloseHandle (hInternet); return bRead; } функция вызвается многократно в цикле, вызов происходит примерно так: Код (Text): bReq = Request("www.wasm.ru/forum/","post.php?fid=12",szData,sizeof(szData) Проблема в следующем: Иногда при получении данных, данные начинают повторяться. Т.е. складывается ощущение будто буфер в функции InternetReadFile не сбрасывается и при многократном вызове выдает одно и тоже (по крайней мере трассировка в отладчике навела меня на эту мысль). хотя при проверке с браузера скрипт выдает уже совсем другое. из за непостоянства ошибки, не могу понять что я делаю не так. Может есть другой способ обращения к скрипту? (кроме сокетов) П.С. заранее всем спасибо...
приложение должно вызывать функцию InternetReadFile до тех пор пока она возвращает TRUE и lpdwNumberOfBytesRead будет равно нулю. так? обязательно в условии отслеживать обе переменные? т.е. моя ошибка может возникать из за этого? или из за этого в том числе ? =)))
почему? =( был бы очень рад если б мне указали на все ошибки. весь форум перечитал, все примеры о "загрузке файла"
Проблема так и не решена. Был бы очень благодарен, за помощь. а вот рабочий код, только он на загрузку файла. (написан Cr4sh`ем) Код (Text): do { uRetry = 0; do { dwReadFileCount = 0; bOk = InternetReadFile(hSource, buff, sizeof(buff), &dwReadFileCount); } while (!(dwReadFileCount || bOk || uRetry++ == 10)); if (dwReadFileCount) { dwWriteFileCount = 0; bOk = WriteFile(hFile, buff, dwReadFileCount, &dwWriteFileCount, NULL); if (bOk && dwReadFileCount == dwWriteFileCount) dwWriteFileTotal += dwWriteFileCount; else dwReadFileCount = 0; } } while (dwReadFileCount); в условии Код (Text): while (!(dwReadFileCount || bOk || uRetry++ == 10)) тоже стоит ИЛИ. только я не могу понять почему 10 ?
Код (Text): int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize) { HINTERNET hInternet; HINTERNET hConnect; HINTERNET hRequest; DWORD dwBytesRead, dwReaded = 0; BOOL bSend; BOOL bRead; hInternet = InternetOpen("Здесь парвильное название для User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL); if (hInternet != NULL) { hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0); if (hConnect != NULL) { hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,0); if (hRequest != NULL) { bSend = HttpSendRequest(hRequest,NULL,0,NULL,0); if (bSend) { for(;;) { bRead = InternetReadFile(hRequest,szData + dwReaded,DataSize - dwReaded - 1,&dwBytesRead); if (bRead == FALSE || dwBytesRead == 0)break; dwReaded += dwBytesRead; if(dwReaded >= DataSize - 1)break; } szData[min(dwReaded, DataSize - 1)] = 0; //Спать хочу, туплю, но работаь будет } InternetCloseHandle (hRequest); } InternetCloseHandle (hConnect); } InternetCloseHandle (hInternet); return bRead; } //Вот так нада вызывать. bReq = Request("www.wasm.ru","/forum/post.php?fid=12",szData,sizeof(szData));
Большое спасибо. Алгоритм я понял. но почему именно так, не совсем. я согласен что весь код кривой, ибо я далеко не гуру в кодинге, поэтому прошу не судить строго =) Я исправил ошибку, последовал старому совету "если не можешь найти ошибку, перепиши весь код" Код (Text): int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize) { HINTERNET hInternet; HINTERNET hConnect; HINTERNET hRequest; DWORD dwBytesRead=0; BOOL bSend=FALSE; BOOL bRead=FALSE; hInternet = InternetOpen("Open",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_DONT_CACHE); if (hInternet == NULL) goto end; hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1u); if (hConnect == NULL) goto end; hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,1); if (hRequest == NULL) goto end; bSend = HttpSendRequest(hRequest,NULL,0,NULL,0); if (bSend==FALSE) goto end; for(;;) { bRead = InternetReadFile(hRequest,szData,DataSize-1,&dwBytesRead); if (bRead == FALSE || dwBytesRead == 0) break; szData[dwBytesRead]=0; } bRead = TRUE; end: InternetCloseHandle(hInternet); InternetCloseHandle(hConnect); InternetCloseHandle(hRequest); return bRead; } Мне почему то показалось, что в моем предыдущем коде вызовы InternetCloseHandle не выполняются после окончания цикла. я прав? П.С. я не сомневаюсь что исправления в цикле сделанные djmans`ом лучше моего варианта, однако я так и не понял, почему приходиться самостоятельно расчитывать указательно на буфер при каждом вызове InternetReadFile? я почему то думал функция сама должна это делать.
все таки ошибка повторяется. Был бы очень благодарен, если кто нить показал рабочий пример получения информации с динамической страницы.
Всем привет. Тема уже старовата, но все же подниму. Пишу свой клиент для браузерной игры (по сути свой браузер, заточенный по хоткеям и прочим мелким радостям) Все с винИнетом понятно кроме одного. Я решил использовать функцию InternetOpenUrl() (хотя результат идентичен и для связки HttpOpenRequest() + HttpSendRequest()) и заметил такой факт. - адрес типа www.domain_name.ru/enter.php : открывается без проблем; - адрес типа www.domain_name.ru/forum/ : не открывается. IE говорит, что "Не может отобразить страницу". Может кто-нибудь подсказать, из-за чего такое может возникнуть??
Добавлю, что почти все страницы содержат в себе redirect на саму себя. Так что, как вариант, проблема не в WinINet, а в этом.