HttpSendRequestA和InternetReadFile总是返回相同的内容

问题描述 投票:0回答:1

该代码的目标是下载少量RSS新闻或任何内容。

void getRssNews(HINTERNET hData, char *rssDownloaded)
{
    HttpSendRequestA(hData, NULL, 0, NULL, 0);
    DWORD bytesRead = 0;
    DWORD totalBytesRead = 0;

    while (InternetReadFile(hData, rssDownloaded, 2000, &bytesRead) && bytesRead != 0)
    {
        rssDownloaded[bytesRead] = 0; // insert the null terminator.
        totalBytesRead += bytesRead;
    }
}

int main()
{
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE);
    HINTERNET hConnection = InternetConnectA(hInternet, "mysite.com", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 0);
    HINTERNET hData = HttpOpenRequestA(hConnection, "GET", "/rss", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);
    std::string previousContent = "";

    while (true)
    {
        char rssDownloaded[2048];
        getRssNews(hData, rssDownloaded); // PROBLEM HERE / THE RETURN IS ALWAYS THE SAME

        if (rssDownloaded != previousContent)
        {
            previousContent = rssDownloaded;
        }
    }

    InternetCloseHandle(hData);
    InternetCloseHandle(hConnection);
    InternetCloseHandle(hInternet);

}

问题是,Web请求在函数getRssNews中返回的内容始终相同。我已经配置了不使用参数INTERNET_FLAG_NO_CACHE_WRITE进行缓存的请求,但没有任何变化。我不知道问题出在哪里。

c++ winapi httpwebrequest wininet
1个回答
0
投票

void getRssNews(HINTERNET hData, char *rssDownloaded)没有返回值。并且第一个while循环永不中断。循环必须具有打破它的条件,否则它将永远持续下去。解决它的一种方法是删除第一个while循环:

//while(true)
{
    char rssDownloaded[2048] = {0};
    getRssNews(hData, rssDownloaded); 
    previousContent = rssDownloaded;
}

如果网站的字符数少于2000,则上述功能可能会起作用。您想要增加缓冲区大小以确保其正常工作。请注意,rssDownloaded为2048字节,但是getRssNews读取2000字节。您可以按以下步骤解决此问题:

int getRssNews(HINTERNET hData, std::string &content)
{
    char buf[2000] = { 0 };
    DWORD bytesRead = 0;
    if(!InternetReadFile(hData, buf, sizeof(buf), &bytesRead))
        return 0;
    if (bytesRead)
        content.append(buf, bytesRead);
    return bytesRead;
}

int main()
{
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE);
    HINTERNET hConnection = InternetConnectA(hInternet, "mysite.com", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 0);
    HINTERNET hData = HttpOpenRequestA(hConnection, "GET", "/rss", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);
    HttpSendRequestA(hData, NULL, 0, NULL, 0);

    std::string content;

    while(true)
    {
        if(!getRssNews(hData, content))
            break;
    }

    MessageBox(0, content.c_str(), 0, 0);
    InternetCloseHandle(hData);
    InternetCloseHandle(hConnection);
    InternetCloseHandle(hInternet);
    return 0;
}

最后,您正在阅读ANSI中的内容。您应该改用Unicode函数。输出可能为UTF8格式。

© www.soinside.com 2019 - 2024. All rights reserved.