Проблемы с "GET" запросом к скрипту. (wininet API)

Тема в разделе "WASM.NETWORKS", создана пользователем EvilCoder, 4 янв 2009.

  1. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    Здравствуйте!
    есть скрипт, содержание (результат) которого постоянно меняется.
    есть функция:
    Код (Text):
    1. int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize)  {
    2.     HINTERNET hInternet;
    3.     HINTERNET hConnect;
    4.     HINTERNET hRequest;
    5.     DWORD dwBytesRead;
    6.     BOOL bSend;
    7.     BOOL bRead;
    8.  
    9.     hInternet = InternetOpen("Open",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
    10.     if (hInternet != NULL) {
    11.         hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1u);
    12.         if (hConnect != NULL) {
    13.             hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,1);
    14.             if (hRequest != NULL) {
    15.                 bSend = HttpSendRequest(hRequest,NULL,0,NULL,0);
    16.                 if (bSend) for(;;) {
    17.                     bRead = InternetReadFile(hRequest,szData,DataSize-1,&dwBytesRead);
    18.                     if (bRead == FALSE || dwBytesRead == 0)
    19.                         break;
    20.                     szData[dwBytesRead]=0;
    21.                     }
    22.                 }
    23.             InternetCloseHandle (hRequest);
    24.             }
    25.         InternetCloseHandle (hConnect);
    26.         }
    27.     InternetCloseHandle (hInternet);
    28.     return bRead;
    29. }
    функция вызвается многократно в цикле, вызов происходит примерно так:
    Код (Text):
    1. bReq = Request("www.wasm.ru/forum/","post.php?fid=12",szData,sizeof(szData)
    Проблема в следующем:
    Иногда при получении данных, данные начинают повторяться. Т.е. складывается ощущение будто буфер в функции InternetReadFile не сбрасывается и при многократном вызове выдает одно и тоже (по крайней мере трассировка в отладчике навела меня на эту мысль). хотя при проверке с браузера скрипт выдает уже совсем другое.
    из за непостоянства ошибки, не могу понять что я делаю не так.
    Может есть другой способ обращения к скрипту? (кроме сокетов)

    П.С. заранее всем спасибо...
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а у тебя
    if (bRead == FALSE || dwBytesRead == 0)
     
  3. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    приложение должно вызывать функцию InternetReadFile до тех пор пока она возвращает TRUE и lpdwNumberOfBytesRead будет равно нулю.
    так?
    обязательно в условии отслеживать обе переменные?

    т.е. моя ошибка может возникать из за этого? или из за этого в том числе ? =)))
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    так, обязательно, в том числе :))
     
  5. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    у тебя код, одна сплошная ошибка. читай примеры.
     
  6. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    почему? =( был бы очень рад если б мне указали на все ошибки.
    весь форум перечитал, все примеры о "загрузке файла"
     
  7. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    Проблема так и не решена. Был бы очень благодарен, за помощь.
    а вот рабочий код, только он на загрузку файла. (написан Cr4sh`ем)
    Код (Text):
    1.     do {
    2.         uRetry = 0;
    3.         do {
    4.             dwReadFileCount = 0;
    5.             bOk = InternetReadFile(hSource, buff, sizeof(buff), &dwReadFileCount);
    6.         } while (!(dwReadFileCount || bOk || uRetry++ == 10));
    7.  
    8.         if (dwReadFileCount)
    9.         {
    10.                 dwWriteFileCount = 0;
    11.                 bOk = WriteFile(hFile, buff, dwReadFileCount, &dwWriteFileCount, NULL);
    12.                 if (bOk && dwReadFileCount == dwWriteFileCount)
    13.                     dwWriteFileTotal += dwWriteFileCount;
    14.                 else
    15.                     dwReadFileCount = 0;
    16.         }
    17.     } while (dwReadFileCount);
    в условии
    Код (Text):
    1. while (!(dwReadFileCount || bOk || uRetry++ == 10))
    тоже стоит ИЛИ. только я не могу понять почему 10 ?
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    10 (десять) попыток чтения.
     
  9. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    Код (Text):
    1. int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize)
    2. {
    3.     HINTERNET hInternet;
    4.     HINTERNET hConnect;
    5.     HINTERNET hRequest;
    6.     DWORD dwBytesRead, dwReaded = 0;
    7.     BOOL bSend;
    8.     BOOL bRead;
    9.  
    10.     hInternet = InternetOpen("Здесь парвильное название для User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
    11.     if (hInternet != NULL)
    12.     {
    13.         hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    14.         if (hConnect != NULL)
    15.         {
    16.             hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,0);
    17.             if (hRequest != NULL)
    18.             {
    19.                 bSend = HttpSendRequest(hRequest,NULL,0,NULL,0);
    20.                 if (bSend)
    21.                 {
    22.                   for(;;)
    23.                   {
    24.                     bRead = InternetReadFile(hRequest,szData + dwReaded,DataSize - dwReaded - 1,&dwBytesRead);
    25.                     if (bRead == FALSE || dwBytesRead == 0)break;
    26.                    
    27.                     dwReaded += dwBytesRead;
    28.                     if(dwReaded >= DataSize - 1)break;
    29.                   }
    30.                   szData[min(dwReaded, DataSize - 1)] = 0; //Спать хочу, туплю, но работаь будет
    31.                 }
    32.             InternetCloseHandle (hRequest);
    33.             }
    34.         InternetCloseHandle (hConnect);
    35.         }
    36.     InternetCloseHandle (hInternet);
    37.     return bRead;
    38. }
    39.  
    40. //Вот так нада вызывать.
    41. bReq = Request("www.wasm.ru","/forum/post.php?fid=12",szData,sizeof(szData));
     
  10. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    Большое спасибо. Алгоритм я понял. но почему именно так, не совсем.
    я согласен что весь код кривой, ибо я далеко не гуру в кодинге, поэтому прошу не судить строго =)

    Я исправил ошибку, последовал старому совету "если не можешь найти ошибку, перепиши весь код"
    Код (Text):
    1. int Request (const char* lpServer,const char* lpReqString,char* szData,int DataSize)  {
    2.     HINTERNET hInternet;
    3.     HINTERNET hConnect;
    4.     HINTERNET hRequest;
    5.     DWORD dwBytesRead=0;
    6.     BOOL bSend=FALSE;
    7.     BOOL bRead=FALSE;
    8.  
    9.  
    10.     hInternet = InternetOpen("Open",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_DONT_CACHE);
    11.     if (hInternet == NULL) goto end;
    12.  
    13.     hConnect = InternetConnect(hInternet,lpServer,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1u);
    14.     if (hConnect == NULL) goto end;
    15.  
    16.     hRequest = HttpOpenRequest(hConnect,"GET",lpReqString,NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,1);
    17.     if (hRequest == NULL) goto end;
    18.  
    19.     bSend = HttpSendRequest(hRequest,NULL,0,NULL,0);
    20.     if (bSend==FALSE) goto end;
    21.     for(;;)
    22.     {
    23.         bRead = InternetReadFile(hRequest,szData,DataSize-1,&dwBytesRead);
    24.         if (bRead == FALSE || dwBytesRead == 0)
    25.             break;
    26.         szData[dwBytesRead]=0;
    27.     }
    28.     bRead = TRUE;
    29. end:
    30.     InternetCloseHandle(hInternet);
    31.     InternetCloseHandle(hConnect);
    32.     InternetCloseHandle(hRequest);
    33.     return bRead;
    34. }
    Мне почему то показалось, что в моем предыдущем коде вызовы InternetCloseHandle не выполняются после окончания цикла. я прав?

    П.С. я не сомневаюсь что исправления в цикле сделанные djmans`ом лучше моего варианта, однако я так и не понял, почему приходиться самостоятельно расчитывать указательно на буфер при каждом вызове InternetReadFile? я почему то думал функция сама должна это делать.
     
  11. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    все таки ошибка повторяется. Был бы очень благодарен, если кто нить показал рабочий пример получения информации с динамической страницы.
     
  12. SilverT

    SilverT New Member

    Публикаций:
    0
    Регистрация:
    12 май 2008
    Сообщения:
    2
    Кэш надо сбрасывать
     
  13. SilverT

    SilverT New Member

    Публикаций:
    0
    Регистрация:
    12 май 2008
    Сообщения:
    2
    сорри, туплю, потрите плиз
     
  14. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    попробуй INTERNET_FLAG_RELOAD or INTERNET_FLAG_DONT_CACHE
     
  15. R1K0

    R1K0 New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    2
    Всем привет. Тема уже старовата, но все же подниму.

    Пишу свой клиент для браузерной игры (по сути свой браузер, заточенный по хоткеям и прочим мелким радостям)

    Все с винИнетом понятно кроме одного. Я решил использовать функцию InternetOpenUrl() (хотя результат идентичен и для связки HttpOpenRequest() + HttpSendRequest()) и заметил такой факт.

    - адрес типа www.domain_name.ru/enter.php : открывается без проблем;
    - адрес типа www.domain_name.ru/forum/ : не открывается. IE говорит, что "Не может отобразить страницу".

    Может кто-нибудь подсказать, из-за чего такое может возникнуть??
     
  16. R1K0

    R1K0 New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    2
    Добавлю, что почти все страницы содержат в себе redirect на саму себя. Так что, как вариант, проблема не в WinINet, а в этом.