C++ WinInet 只发出 1 个请求

Posted

技术标签:

【中文标题】C++ WinInet 只发出 1 个请求【英文标题】:C++ WinInet only making 1 request 【发布时间】:2015-12-16 20:37:41 【问题描述】:

我在本地使用 WinInet 时遇到问题。我有一个运行良好的本地 Apache 网络服务器 (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】:

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

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

关于您的实施的更多信息:

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

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

【讨论】:

以上是关于C++ WinInet 只发出 1 个请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 wininet 创建 POST 请求

在 C++ 中使用 Wininet 发送 POST 请求时的编码问题

无法使用 wininet 获取 POST 请求响应

WinINet:如何防止 HttpSendRequest 跟随重定向(30x 状态代码)?

C++ 使用 WinINet 上传到 FTP 服务器

Windbg里DLL相关下断点