У меня проблемы с использованием WinInet
на местном уровне. У меня есть локальный веб-сервер Apache (xampp), который работает нормально, проблема в том, что когда я пытаюсь сделать GET-запрос к PHP-скрипту, кажется, что он делает это только один раз. Скрипт PHP просто выводит случайное число, и я вижу одно и то же число 3 раза (скрипт не виноват). Я также проверил журнал доступа Apache, и он появляется только один раз. Странно то, что когда он НЕ используется локально, цикл работает отлично и отправляет несколько запросов (Wireshark также показывает это).
Вот код, упрощенный и все еще вызывающий проблемы:
#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");
}
Я не могу понять это …
Я не могу воспроизвести ваше наблюдение, если я, например, запросить www.google.com
,
Я думаю, что ваша программа просто продолжает читать ответ с InternetReadFile
но другой процесс на вашем компьютере еще не завершил запрос. Предлагаю дождаться завершения запроса на использование WinHttpReceiveResponse
перед прочтением содержания ответа.
Еще несколько вещей, касающихся вашей реализации:
Вам не нужно звонить InternetOpen(..)
за каждый новый запрос. Достаточно сделать это один раз и сохранить возвращенный дескриптор, пока ваше приложение не завершится.
Очень важно проверить на ошибки! Ваша функция просто полагается на все вызовы для успеха, что, очевидно, не соответствует действительности из-за вашего вопроса …
Других решений пока нет …