Использование libcurl "multi" интерфейса для загрузки одного файла - C ++ - PullRequest
0 голосов
/ 09 апреля 2020

Я создаю C ++ dll и мне нужно сделать один неблокирующий http-запрос. Я имею в виду, что в определенный момент в dll мне нужно начать загрузку файла в фоновом режиме, но возобновить программу после того, как начнется одиночная загрузка.

В настоящее время я использую libcurl в качестве http-клиента. Я читал, что мультиинтерфейс (https://curl.haxx.se/libcurl/c/libcurl-multi.html) даст мне неблокирующую функциональность, но все примеры, которые я вижу, предназначены для одновременного выполнения нескольких запросов http и ожидания их завершения до конца sh w / a в то время как l oop например. Могу ли я использовать этот интерфейс для выполнения одного http-запроса и возобновления работы программы во время загрузки? И если так, может ли он вызвать обратный вызов после завершения? Или я должен постоянно проверять дескриптор, чтобы видеть, завершена ли загрузка?

Пример одного запроса с мультиинтерфейсом libcurl:

int main() {

    curl_global_init(CURL_GLOBAL_DEFAULT);

    // init easy curl session
    auto curl_easy = curl_easy_init();

    // set url
    auto url = "https://[foo].exe";
    curl_easy_setopt(curl_easy, CURLOPT_URL, url);

    // set curl to write file to directory
    auto path = "C:\\foo\\app.exe";
    auto filePtr = std::fopen(path, "wb");
    curl_easy_setopt(curl_easy, CURLOPT_WRITEFUNCTION, writeFile);
    curl_easy_setopt(curl_easy, CURLOPT_WRITEDATA, filePtr);

    // init multi curl session
    auto multi_handle = curl_multi_init();

    // add easy handle to multi handle
    curl_multi_add_handle(multi_handle, curl_easy);

    auto res = curl_multi_perform(multi_handle, &running);

    auto running = 0;
    while (running) {
        res = curl_multi_perform(multi_handle, &running);
    }

Я бы не хотел, чтобы while (running) l oop и go выполняли другие действия в main, пока загрузка файлов. Я могу неправильно понять «неблокирующую» природу curl_multi_perform (). Разве это неблокирование только в том смысле, что много запросов могут происходить одновременно? Если так, я не думаю, что использование этого для создания одного запроса даст мне то, чего не было бы с curl_easy_perform. Извинения, если это выходит за пределы переполнения стека, я не хочу учебник по libcurl. Но я должен вместо этого использовать что-то вроде блокирующего вызова libcurl (curl_easy_perform) внутри std :: asyn c ()?

...