C++ libcurl 缓存数据响应
C++ libcurl Caching Data Response
我为此使用了 curl 库和 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 从服务器检索并正确解析。获取请求是针对数据而不是来自服务器的文件。
代码的设置方式是每次轮询频率都会检索实验列表。问题是以下场景
- app 启动并检索实验列表,当前
有一项
- 从服务器数据库中删除条目等待
应用程序重新轮询服务器
- 应用看到服务器响应仍然包含已删除的条目。我通过命令行
执行 curl 确认其已删除
curl 库缓存来自服务器的数据结果,然后在我发出请求时返回它似乎有问题。因为当我重新启动应用程序时,它会获得正确的数据。我已经实现了 CURLOPT_DEBUGFUNCTION 并且当我知道服务器已将其从数据库中删除时看到请求返回的旧数据。任何建议可能会导致此问题的选项或缓存?
由于我对 curl lib 的工作方式的误解(我认为),这最终成为我造成的转储错误。我使用 CURLOPT_WRITEFUNCTION 来捕获 char 数组中的数据。我没有完全清除请求之间的这个 buff,因为我假设 curllib 会用“\0”终止新接收的数据,使旧数据无效。但我认为这个假设是不正确的。一旦我在下一个请求之前清除了整个缓冲区,一切都很好。下面是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\n", __FILE__, __FUNCTION__, curlData->maxSize);
return 0;
}
memcpy(&(curlData->buff[curlData->amountWriten]), buffer, size * nmemb);
curlData->amountWriten += size * nmemb;
return size * nmemb;
}
return 0;
}
我为此使用了 curl 库和 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 从服务器检索并正确解析。获取请求是针对数据而不是来自服务器的文件。
代码的设置方式是每次轮询频率都会检索实验列表。问题是以下场景
- app 启动并检索实验列表,当前 有一项
- 从服务器数据库中删除条目等待 应用程序重新轮询服务器
- 应用看到服务器响应仍然包含已删除的条目。我通过命令行 执行 curl 确认其已删除
curl 库缓存来自服务器的数据结果,然后在我发出请求时返回它似乎有问题。因为当我重新启动应用程序时,它会获得正确的数据。我已经实现了 CURLOPT_DEBUGFUNCTION 并且当我知道服务器已将其从数据库中删除时看到请求返回的旧数据。任何建议可能会导致此问题的选项或缓存?
由于我对 curl lib 的工作方式的误解(我认为),这最终成为我造成的转储错误。我使用 CURLOPT_WRITEFUNCTION 来捕获 char 数组中的数据。我没有完全清除请求之间的这个 buff,因为我假设 curllib 会用“\0”终止新接收的数据,使旧数据无效。但我认为这个假设是不正确的。一旦我在下一个请求之前清除了整个缓冲区,一切都很好。下面是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\n", __FILE__, __FUNCTION__, curlData->maxSize);
return 0;
}
memcpy(&(curlData->buff[curlData->amountWriten]), buffer, size * nmemb);
curlData->amountWriten += size * nmemb;
return size * nmemb;
}
return 0;
}