![](/img/trans.png)
[英]libcurl POST - CURLOPT_READFUNCTION & CURLOPT_WRITEFUNCTION for posting XML
[英]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.