簡體   English   中英

將額外的參數傳遞給libcurl CURLOPT_READFUNCTION回調

[英]Pass extra arguments to libcurl CURLOPT_READFUNCTION callback

該程序

讀取文本文件並通過電子郵件發送其內容

原始代碼 (在色河的幫助下)

https://gist.github.com/1342118#file_test.cpp

問題:

我試圖使用線程多次運行應用程序,每個線程使用不同的文本文件。 這意味着我不能再使用全局向量,因為線程1仍在使用它時,線程3可能會添加/更改此向量。 這意味着這條線變得有問題:

curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

這將調用此函數:

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
  struct WriteThis *pooh = (struct WriteThis *)userp;

  if(size*nmemb < 1)
    return 0;

  if (pooh->counter < text.size())
  {
      const std::string& data = text[pooh->counter];

      memcpy(ptr, data.data(), data.length());
      pooh->counter++; /* advance pointer */
      return data.length();
  }
  return 0; /* no more data left to deliver */
}

如您所見,它使用了全局定義的向量“文本”。 我以為我可以通過在該函數中簡單地創建向量(read_callback)來解決此問題,但是由於我現在正在使用線程,因此文件名不再經過硬編碼,因此無論如何我最終都必須傳遞一個變量。

Curl似乎填充了read_callback自動接受的變量,這是怎么做的?

為了澄清,這是我現在所擁有的:

std::vector<string> read_text(char* fname)
{
    std::ifstream myfile (fname);
    std::vector<string> text;

    std::string line;
    while (std::getline(myfile, line))
    {
        text.push_back(line + '\n');
    }

    return text;
}

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{

    std::vector<string> text;
    text = read_text(textfilename);

  struct WriteThis *pooh = (struct WriteThis *)userp;

  if(size*nmemb < 1)
    return 0;

  if (pooh->counter < text.size())
  {
      const std::string& data = text[pooh->counter];

      memcpy(ptr, data.data(), data.length());
      pooh->counter++; /* advance pointer */
      return data.length();
  }
  return 0; /* no more data left to deliver */
}

但是read_text無效,因為未將textfilename傳遞給該函數。

再次仔細閱讀curl_easy_setopt的文檔。 您可以將CURLOPT_READDATA為您的textfilename ,並將userp為將其放入read_callback

編輯

您的userp已被實際使用; 因此,您應該在WriteThis struct的新字段中添加textfilename 大多數回調函數僅使用一個用戶數據,但應該足夠了(因為您可以在其中打包任意內容)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM