C ++ libcurl缓存数据响应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ libcurl缓存数据响应相关的知识,希望对你有一定的参考价值。

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

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;

测试时一切正常,从服务器检索protobuff并正确解析。 get请求用于数据而不是来自服务器的文件。

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

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

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

答案

这最终成为我错误理解curl lib如何工作(我认为)造成的转储错误。我使用CURLOPT_WRITEFUNCTION来捕获char数组中的数据。我没有在请求之间完全清除此buff,因为我假设curllib将使用“ 0”终止新接收的数据,使旧数据无效。但我认为这种假设是不真实的。一旦我在下一次请求之前清除了整个缓冲区,一切都很顺利。 bellow是incase的数据捕获功能

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
", __FILE__, __FUNCTION__, curlData->maxSize);
            return 0;
        }
        memcpy(&(curlData->buff[curlData->amountWriten]), buffer, size * nmemb);
        curlData->amountWriten += size * nmemb;
        return size * nmemb;
    }
    return 0;
}

以上是关于C ++ libcurl缓存数据响应的主要内容,如果未能解决你的问题,请参考以下文章

libcurl怎样判断数据接收完成

C/C libcurl如何POST表单提交,只是普通的web表单提交数据

libcurl

C++ vs2017 - libcurl - http请求 代码大全(请求数据,上传下载文件,多线程上传下载文件)

C - 使用 libcurl 编译 Cmake 程序

libcurl教程