C ++ libcurl缓存数据响应

时间:2019-01-29 01:43:24

标签: caching libcurl google-protocol-buffer

我为此使用curl lib和easy_curl扩展名。 我现在暂时省去代码,因为我认为没有必要解释该问题。我正在使用c ++和curl lib以便从服务器检索序列化的google原型。序列化的原型包含一个整数和一个静态对象数组。编译后的probbuff看起来像

typedef struct _ExperimentRunner_ExperimentList_RES {
    int32_t pollFrequency;
    pb_size_t activeExperiments_count;
    ExperimentRunner_ExperimentInfo activeExperiments[5];
/* @@protoc_insertion_point(struct:ExperimentRunner_ExperimentList_RES) */
} ExperimentRunner_ExperimentList_RES;

经过测试后,一切正常,并且从服务器中检索了probbuff并正确进行了解析。获取请求用于获取数据,而不是来自服务器的文件。

以如下方式设置代码:在每个轮询频率下检索实验列表。问题是以下情况

  1. 应用启动并检索实验列表,当前 有一个条目
  2. 从服务器数据库中删除条目,等待 应用以重新轮询服务器
  3. 应用程序看到服务器响应仍然包含已删除的条目。我通过在命令行中卷曲来确认已将其删除

curl库似乎在缓存来自服务器的数据结果,然后在我发出请求时将其返回,这是一个问题。因为当我重新启动应用程序时,它将获取正确的数据。我已经实现了CURLOPT_DEBUGFUNCTION,当我知道服务器已将其从数据库中删除时,可以看到请求返回的旧数据。有什么建议可能会导致什么选项或缓存吗?

1 个答案:

答案 0 :(得分:0)

由于我对curl lib的工作原理的误解(我认为),最终导致了我的转储错误。我正在使用CURLOPT_WRITEFUNCTION捕获char数组中的数据。我没有完全清除请求之间的增益,因为我假设curllib将以“ \ 0”终止新接收的数据,从而使旧数据无效。但是我认为这个假设是不正确的。一旦我在下一个请求之前清除了整个缓冲区,一切就很好了。波纹管是万一情况下的数据捕获功能

size_t CURL_RECIEVE_DATA_BUFF(void *buffer, size_t size, size_t nmemb, void *userp)
{
    CURL_DATA_BUFF* curlData = (CURL_DATA_BUFF*)userp;
    if (curlData)
    {
        if (curlData->amountWriten >= curlData->maxSize) {
            LogIt.Add(Error, "%s:%s Server sending more data than expected, max is: %d bytes\n", __FILE__, __FUNCTION__, curlData->maxSize);
            return 0;
        }
        memcpy(&(curlData->buff[curlData->amountWriten]), buffer, size * nmemb);
        curlData->amountWriten += size * nmemb;
        return size * nmemb;
    }
    return 0;
}