该代码的目标是下载少量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
进行缓存的请求,但没有任何变化。我不知道问题出在哪里。
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格式。