gpt4 book ai didi

c++ - 将额外参数传递给 libcurl CURLOPT_READFUNCTION 回调

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:16 32 4
gpt4 key购买 nike

程序

读出一个文本文件并将其内容通过电子邮件发送

原代码(借助Sehe)

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

问题:

我正在尝试使用线程多次运行应用程序,为每个线程使用不同的文本文件。这意味着我不能再使用全局 vector ,因为线程 3 可能会添加/更改此 vector ,而线程 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 */
}

如您所见,它使用全局定义的 vector “文本”。我以为我可以通过简单地在该函数 (read_callback) 中创建 vector 来修复它,但由于我现在使用线程,文件名不再是硬编码的,所以我最终不得不传递一个变量。

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。大多数回调函数只接受一个用户数据,但这应该足够了(因为您可以在其中打包任意内容)。

关于c++ - 将额外参数传递给 libcurl CURLOPT_READFUNCTION 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8033311/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com