curl_multi_fdset возвращает всегда 1 - PullRequest
0 голосов
/ 18 декабря 2018

Что я хочу сделать: загрузить несколько файлов одновременно.

Проблема: curl_multi_fdset всегда возвращать 1.

Выпуск 2: Я не совсем понимаю, как работает fd_set.Я новичок в C, и документ довольно запутанный.

Источники : я использовал этот пример и этот индикатор прогресса .

Мой полный .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;
}
...