C++ WinINet InternetReadFile函数刷新

Posted

技术标签:

【中文标题】C++ WinINet InternetReadFile函数刷新【英文标题】:C++ WinINet InternetReadFile function refresh 【发布时间】:2015-03-10 09:40:18 【问题描述】:

我正在尝试在 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 的频率更新文件,我希望我的代码只有在服务器更新后才能读取文件。 InternetReadFile 可以做那种事情吗?也许有一个 FLAG,但我在 MSDN 上没有找到任何东西。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

HTTP 协议中没有办法让你直接这样做,因此 WinHTTP 中没有这样的功能。最简单的解决方案可能是下载文件并查看它是否已更改,如果文件相对较小,或者文件很大,则让写入文件的服务器在其旁边写入时间戳、校验和或计数器增量文件.

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

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

【讨论】:

我认为不可能这样做。时间戳也是我找到的解决方案,我认为这是最好的方法。感谢您的帮助:) @Irisciences,如果您使用时间戳,请确保时间来自具有足够高分辨率的计时器源,即小于 20 毫秒【参考方案2】:
    如果 HTTP 服务器有一个页面,其中包含有关此文件的信息(例如时间戳)(无论是否生成了文件;该页面也可能生成),您可以检查此页面。 如您所知,服务器以(几乎)恒定的速度更新文件,您的应用可能只使用计时器。

附:我怀疑每秒读取某个文件 50 次是否真的有意义。

【讨论】:

我将尝试搜索可以帮助我的 HTTP 页面信息。更新大部分时间以恒定速度完成,但不幸的是,速度可能会发生一些变化。 P.S:服务器以 50Hz 刷新文件(总是发布 xml 文件中的新数据),我必须获取所有信息。我只是得到报酬来完成这项任务^^。

以上是关于C++ WinINet InternetReadFile函数刷新的主要内容,如果未能解决你的问题,请参考以下文章

C++ wininet,连接weblogin,如何设置cookies?

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

C++ WinInet 和回调不起作用

WinInet C++ ftp 模板?

C++ Wininet 自定义 http 标头

C++ 下载文件 WinInet - 0kb 写入文件