C ++ WinInet делает только 1 запрос

У меня проблемы с использованием 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");
}

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

1

Решение

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

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

Еще несколько вещей, касающихся вашей реализации:

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]