2011-11-07 150 views
1

程序传递额外的参数给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不起作用。

回答

1

再次仔细阅读curl_easy_setopt的文档。你可能会设置CURLOPT_READDATAtextfilename和铸userp得到它你read_callback

编辑内部

userp实际使用;所以您应该将textfilename添加到您的WriteThisstruct的新字段中。大多数回调函数只接受一个用户数据,但它应该足够了(因为你可以在其中包含任意的东西)。

+0

我不明白你的意思是“将userp放在里面”。谷歌搜索“libcurl强制用户名”使我回到这个问题,文档似乎也没有任何信息。 – natli

+0

我编辑了我的回复。对不起,没有看到那个userp被使用。你应该更多地使用它。也许通过为它定义另一个结构。 –

+0

感谢分配,这样做! – natli