Сбой записи данных с CURLOPT_WRITEFUNCTION после многих вызовов обратной записи - PullRequest
0 голосов
/ 10 января 2019

По сути, у меня есть обратный вызов записи, который я установил для CURLOPT_WRITEFUNCTION. Я также установил свой указатель для записи данных в CURLOPT_WRITEDATA.

Я запускаю бесконечный цикл while в течение примерно 5 секунд, затем CURLOPT не удается направить данные в указатель void * up, определенный в CURLOPT_WRITEDATA, затем после этого одного сбоя он снова начинает работать. Я получил тонны успешных записей с ошибками. Это проблема с памятью, и если да, есть ли способ обойти эту проблему вообще?

// these locations will likely be different on your local.    
#include "../cygwin64/usr/include/curl/curl.h"
#include "../cygwin64/usr/include/json/json.h"

size_t write_callback(char *buf, size_t size, size_t nmemb, void* up) {
  size_t num_bytes = size*nmemb;
  std::string* data = (std::string*) up;
  for(int i = 0; i < num_bytes; i++) {
    data->push_back(buf[i]);
  }
  return num_bytes;
}


CURL* init_curl(struct curl_slist *headers, std::string* chunk) {
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_callback);
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) chunk);
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  return curl;
 }

bool curl_get(struct curl_slist *headers, const std::string& url,
  Json::Value* json_res) {

  // this is where my data should be written to
  std::string data;
  CURL* curl = init_curl(headers, &data);
  CURLcode res;
  bool success = true;
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    res = curl_easy_perform(curl);

    if(res != CURLE_OK) {
      std::cout << "Could not perform get for " << url << std::endl;
      std::cout << curl_easy_strerror(res) << std::endl;
      success = false;
    } else {
      Json::Value json_data;
      Json::CharReaderBuilder json_reader;
      std::istringstream stream_data(data);
      std::string errs;
      if(Json::parseFromStream(json_reader, stream_data, &json_data, &errs)) {
        std::cout << "successfully parsed JSON data for: " << url << std::endl;
        *json_res = json_data;
      } else {
        std::cout << "failed to parse JSON data for: " << url << std::endl;
        std::cout << errs << std::endl;
        std::cout << json_data << std::endl;
        std::cout << "finished failing" << std::endl;
        success = false;
      }
    }
  } else {
    success = false;
  }
  curl_slist_free_all(headers);
  curl_easy_cleanup(curl);
  return success;
}

int main(int argc, char** argv) {
    curl_global_init(CURL_GLOBAL_ALL);
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Accept: application/json");
    while (true) {


          Json::Value response;
          if (curl_get(headers, "https://api.robinhood.com/quotes/?symbols=AMZN", &response)) {
               std::cout << response << std::endl;
          } else {

               // reaches here sometimes because response (my data) is null
               std::cout << "failed to get last trade price" << std::endl;
          }
    }
    curl_global_cleanup();
    return 0;
}

Не ожидайте сбоев, но я периодически получаю сбои, чтобы направить данные в мой блок WRITEDATA.

...