Php C++;WinInet仅发出1个请求

Php C++;WinInet仅发出1个请求,php,c++,apache,wininet,Php,C++,Apache,Wininet,我在本地使用WinInet时遇到问题。我有一个本地ApacheWebServer(xampp),它运行得很好,问题是当我试图向PHP脚本发出GET请求时,它似乎只执行了一次。PHP脚本只输出一个随机数,我看到相同的数字3次(脚本没有错误)。我还检查了Apache访问日志,它只显示一次。奇怪的是,当不在本地使用它时,循环工作得很好,它确实发送了多个请求(Wireshark也显示了这一点) 以下是代码,经过简化,仍然存在问题: #include <Windows.h> #include

我在本地使用WinInet时遇到问题。我有一个本地ApacheWebServer(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");
}
#包括
#包括
#包括
#包括
#pragma注释(lib,“wininet.lib”)
void req()
{
HINTERNET HINTERNET=InternetOpenW(L“useragent”,INTERNET\u OPEN\u TYPE\u DIRECT,NULL,NULL,0);
HINTERNET hConnect=InternetConnectW(HINTERNET,L“127.0.0.1”,80,NULL,NULL,INTERNET\u服务\u 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::字符串strResponse;
常量int nBuffSize=1024;
字符buff[nBuffSize];
BOOL bKeepReading=true;
DWORD dwBytesRead=-1;
while(bKeepReading&&dwBytesRead!=0)
{
bKeepReading=InternetReadFile(hRequest、buff、nBuffSize和dwBytesRead);
strResponse.append(buff,dwBytesRead);
}

std::cout如果我查询例如
www.google.com
,我无法再现您的观察结果

我认为您的程序只是继续使用
InternetReadFile
读取响应,但您机器上的另一个进程尚未完成请求。我建议在读取响应内容之前,先等待请求完成

关于您的实施,还有一些事情:

  • 您不需要为每个新请求调用
    InternetOpen(..)
    。只需调用一次并存储返回的句柄,直到应用程序终止

  • 检查错误是非常重要的!您的函数仅仅依赖于所有调用才能成功,但由于您的问题,显然情况并非如此