C ++ WinInet只发出1个请求

时间:2015-12-16 20:37:41

标签: php c++ apache wininet

我在本地使用WinInet时遇到问题。我有一个运行良好的本地Apache webserver(xampp),问题是当我尝试向PHP脚本发出GET请求时,它似乎只执行一次。 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 个答案:

答案 0 :(得分:1)

如果我查询例如www.google.com,我无法重现您的观察结果。

我认为您的程序只是继续使用InternetReadFile阅读回复,但您机器上的其他进程尚未完成请求。我建议在阅读回复内容之前等待请求使用WinHttpReceiveResponse完成。

有关您实施的更多信息:

  • 您无需为每个新请求致电InternetOpen(..)。足以执行此操作并存储返回的句柄,直到您的应用程序终止。

  • 检查错误非常重要!你的功能完全取决于所有成功的要求,但由于你的问题,这似乎并非如此......