我正在尝试使用C++中的WinHTTP获取文件的内容。该文件是XML文件,由服务器上的可执行文件生成。

用于初始化,连接甚至读取指定服务器地址上的文件的代码正在运行。

// Connect to internet.
m_hInternet = InternetOpen(L"HTTPRIP",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);

// Check if worked.
if( !m_hInternet )
    return;

// Connect to selected URL.
m_hUrl = InternetOpenUrlA(m_hInternet, strUrl.c_str(), NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RESYNCHRONIZE, 0);

// Check if worked.
if( !m_hUrl )
    return;

if( InternetReadFile(m_hUrl, buf, BUFFER_SIZE, &bytesread) && bytesread != 0 )
{
    // Put into std::string.
    strData = std::string(buf,buf+bytesread);
}

现在,我要更新文件(相同的地址)。服务器以50Hz的频率更新文件,我希望我的代码仅在服务器已更新的情况下才能够读取File。 InternetReadFile可以做这种事情吗?也许带有标志,但是我在MSDN上找不到任何东西。

谢谢你的帮助。

最佳答案

HTTP协议(protocol)中无法直接执行此操作,因此WinHTTP中没有此类功能。最简单的解决方案可能是下载文件并查看文件是否已更改,文件相对较小或文件较大,让写入文件的服务器在其旁边写入时间戳,校验和或计数器增量文件。

然后,您的代码将下载校验和文件,查看其是否已更改,在这种情况下,请下载原始文件。

否则,另一个解决方案是将时间戳或类似数据放在XML文件的开头,如果时间戳(或校验和)未更新,则停止下载文件。 (当然,这有其自身的缺点,您可能必须编写自己的解析器。)

10-06 12:42