我要做什么:同时下载多个文件。
问题: curl_multi_fdset
始终返回1。
问题2:我不太了解fd_set的工作原理。我是C语言的新手,文档令人困惑。
来源:我使用了this example和this progress bar。
我的完整.cpp :Github
因此问题似乎出在初始化方法中:
static void initialize(CURLM *cm, int i, char* url[], std::string filepath)
{
CURL *eh = curl_easy_init();
FILE *fp; // added to the example
fp = fopen(filepath.c_str(), "wb"); // added to the example
curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(eh, CURLOPT_WRITEDATA, fp); // added to the example
curl_easy_setopt(eh, CURLOPT_NOPROGRESS, 0); // added to the example
curl_easy_setopt(eh, CURLOPT_HEADER, 0L);
curl_easy_setopt(eh, CURLOPT_URL, url[i]);
curl_easy_setopt(eh, CURLOPT_PRIVATE, url[i]);
curl_easy_setopt(eh, CURLOPT_VERBOSE, 0L);
curl_easy_setopt(eh, CURLOPT_PROGRESSFUNCTION, progress_func); // added to the example
curl_multi_add_handle(cm, eh);
}
但是,如果没有这些其他选项,它也将无法工作。因此,它必须有所不同,但我没有更改fd_set的任何内容。任何帮助表示赞赏。
初始化调用:
CURLM *cm = nullptr;
CURLMsg *msg;
long L;
unsigned int C = 0;
int M, Q, U = -1;
fd_set R, W, E;
struct timeval T;
curl_global_init(CURL_GLOBAL_ALL);
/* we can optionally limit the total amount of connections this multi handle uses */
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long) MAX);
if ((argc - 2) < MAX)
{
for (C = 0; C < argc - 2; ++C)
{
path = "test" + std::to_string(C) + ".html";
initialize(cm, C, urls, path);
}
}
返回1的函数的调用
FD_ZERO(&R);
FD_ZERO(&W);
FD_ZERO(&E);
if (curl_multi_fdset(cm, &R, &W, &E, &M))
{
fprintf(stderr, "E: curl_multi_fdset\n");
return EXIT_FAILURE;
}