程序传递额外的参数给libcurl的CURLOPT_READFUNCTION回调
读出文本文件和电子邮件,其内容
原代码(与Sehe的帮助)
https://gist.github.com/1342118#file_test.cpp
问题:
我想使用线程多次运行应用程序,为每个线程使用不同的文本文件。这意味着我不能再使用全局向量,因为线程3可能会添加/更改此向量,而线程1仍在处理它。这意味着该行成为问题:
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 */
}
但由于textfilename尚未传递给函数read_text不起作用。
我不明白你的意思是“将userp放在里面”。谷歌搜索“libcurl强制用户名”使我回到这个问题,文档似乎也没有任何信息。 – natli
我编辑了我的回复。对不起,没有看到那个userp被使用。你应该更多地使用它。也许通过为它定义另一个结构。 –
感谢分配,这样做! – natli