При помощи curl_easy, каждый завернутый в std::async скачиваю файлы.
Создано 3 асинхронных запроса, но возникает проблема когда один из запросов натыкается на крупный файл и начинает его скачивать, от этого зависает вся программа. Выходит так что асинхронные запросы, совершенно не асинхронные.
using namespace std;
int allGameFileCount = 9999; // Здесь записывается кол-во нужных файлов
string allGameFiles[10000] = {}; // Здесь записаны названия файлов
bool downloadFile(const char* filename, const char* out)
{
CURL* curl;
curl = curl_easy_init();
if (curl)
{
FILE* fp;
fp = fopen(out, "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteToFile);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
CURLcode result = curl_easy_perform(curl);
long httpStatusCode = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpStatusCode);
if (result == CURLE_OK && httpStatusCode == 200)
{
// Success
curl_easy_cleanup(curl);
fclose(fp);
return true;
}
fclose(fp);
}
curl_easy_cleanup(curl);
return false;
}
int main() {
future<void> f1 = async(launch::async, [] {
if (downloadGameFile(allGameFiles[allGameFileCount].c_str(), allGameFiles[allGameFileCount].c_str()))
{
allGameFiles[allGameFileCount] = "";
allGameFileCount--;
}});
future<void> f2 = async(launch::async, [] {
if (downloadGameFile(allGameFiles[allGameFileCount-1].c_str(), allGameFiles[allGameFileCount-1].c_str()))
{
allGameFiles[allGameFileCount-1] = "";
allGameFileCount--;
}});
future<void> f3 = async(launch::async, [] {
if (downloadGameFile(allGameFiles[allGameFileCount-2].c_str(), allGameFiles[allGameFileCount-2].c_str()))
{
allGameFiles[allGameFileCount-2] = "";
allGameFileCount--;
}});
}