2015-12-16 3 views
1

У меня возникли проблемы с использованием WinInet локально. У меня есть локальный веб-сервер Apache (xampp), который работает хорошо, проблема в том, что когда я пытаюсь сделать запрос GET на PHP-скрипт, кажется, что он делает это только один раз. PHP-скрипт просто выводит случайное число, и я вижу то же число 3 раза (сценарий не виноват). Я также проверил журнал доступа к Apache, и он появляется только один раз. Странно, что, когда НЕ использует его локально, цикл работает отлично, и он отправляет несколько запросов (это также показывает Wireshark).C++ WinInet только делает 1 запрос

Вот код, упрощена и все еще дает проблемы:

#include <Windows.h> 
#include <WinInet.h> 
#include <iostream> 
#include <string> 

#pragma comment(lib, "wininet.lib") 

void req() 
{ 
    HINTERNET hInternet = InternetOpenW(L"useragent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 

    HINTERNET hConnect = InternetConnectW(hInternet, L"127.0.0.1", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); 

    HINTERNET hRequest = HttpOpenRequestW(hConnect, L"GET", L"test/test.php", NULL, NULL, NULL, 0, 0); 

    BOOL bRequestSent = HttpSendRequestW(hRequest, NULL, 0, NULL, 0);  

    std::string strResponse; 
    const int nBuffSize = 1024; 
    char buff[nBuffSize]; 

    BOOL bKeepReading = true; 
    DWORD dwBytesRead = -1; 

    while (bKeepReading && dwBytesRead != 0) 
    { 
     bKeepReading = InternetReadFile(hRequest, buff, nBuffSize, &dwBytesRead); 
     strResponse.append(buff, dwBytesRead); 
    } 

    std::cout << strResponse << std::endl; 

    InternetCloseHandle(hRequest); 
    InternetCloseHandle(hConnect); 
    InternetCloseHandle(hInternet); 
} 

int main() 
{ 
    for (int x = 0;x < 3; x++) // 3 times 
    { 
     req(); 
     Sleep(2000); 
    } 

    system("PAUSE"); 
} 

Я не могу понять это ...

ответ

1

Я не могу воспроизвести ваши наблюдения, если я запрашиваю для пример www.google.com.

Я думаю, что ваша программа просто продолжает читать ответ с InternetReadFile, но другой процесс на вашем компьютере еще не завершил запрос. Я предлагаю дождаться завершения запроса с использованием WinHttpReceiveResponse перед чтением содержимого ответа.

Некоторые другие вещи, касающиеся вашей реализации:

  • Вам не нужно звонить InternetOpen(..) для каждого нового запроса. Достаточно сделать это один раз и сохранить возвращенный дескриптор до тех пор, пока ваше приложение не завершится.

  • Очень важно проверить наличие ошибок! Ваша функция просто зависит от всех звонков, которые, вероятно, не связаны с вашим вопросом ...

 Смежные вопросы

  • Нет связанных вопросов^_^