C ++ libcurl Кэширование данных ответа - PullRequest
0 голосов
/ 29 января 2019

Я использую для этого curl lib и расширение easy_curl.Сейчас я собираюсь пропустить код, так как не думаю, что это необходимо для объяснения проблемы.Я использую c ++ и curl lib для получения сериализованного прототипа Google с сервера.Сериализованный протобуфф содержит целое число и статический массив объектов.Скомпилированный протобуфф выглядит так:

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;

При тестировании все работает нормально, и протобуфф извлекается с сервера и анализируется правильно.Запрос get предназначен для данных, а не файла с сервера.

Код настроен таким образом, что список экспериментов извлекается при каждой частоте опроса.Проблема заключается в следующем сценарии

  1. запуска приложения и получения списка экспериментов, который в настоящее время имеет одну запись
  2. удалить запись из базы данных сервера, подождите, пока приложение повторно опроситсервер
  3. Приложение видит ответ сервера, все еще содержащий запись, которая была удалена.Я подтверждаю его удаление, выполняя curl из командной строки

Кажется, есть проблема с библиотекой curl, которая кэширует результат данных с сервера, а затем возвращает его, когда я делаю запрос.так как, когда я перезапускаю приложение, оно получает правильные данные.Я реализовал CURLOPT_DEBUGFUNCTION и вижу старые данные, возвращаемые запросом, когда я знаю, что сервер удалил их из базы данных.Любые предложения, какие опции или кеширование могут вызывать это?

1 Ответ

0 голосов
/ 30 января 2019

Это закончилось тем, что я сделал ошибку дампа, вызванную неправильным пониманием того, как работает curl lib (я думаю).Я использовал CURLOPT_WRITEFUNCTION для захвата данных в массив символов.Я не полностью очищал этот буфер между запросами, так как предполагал, что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...