Не получается запустить более 4 потоков URLDownloadToFile

260
26 ноября 2017, 14:54

Имеется такая функция, которая нужно выполнять одновременно в 100 потоков.

void tryURL()
{
    randURL.clear();
    for (unsigned short i = 0; i < urlLength; i++) {
        randURL = randURL + alphabet[getRand()];
    }
    if (SUCCEEDED(URLDownloadToFile(NULL, LPCWSTR((beginURL + randURL + endURL).c_str()), LPCWSTR((randURL + L"/" + endURL).c_str()), 0, NULL)))
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN);
        wcout << L"Downloaded! " << endl;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
}

Распараллелил так:

while (1) {
    for (int i = 0; i < threadsCount; ++i) {
        thr[i] = thread(tryURL);
    }
    cout << "100 threads done" << endl;
    for (int i = 0; i < threadsCount; ++i) {
        thr[i].join();
    }
    cout << "100 threads joined" << endl;
}

Но при этом эта функция не посылает более 4 запросов одновременно. Может, где то надо отключить лимитирование по ядрам процессора? Уже переломал всю голову, никак не могу найти в чём проблема. С источником рандома всё нормально, используется системный.

Answer 1

Скорее всего, дело не в потоках, а в ограничениях используемого сетевого стека.

В WinIneturlmon.dll, в которой реализована функция URLDownloadToFile, использует именно её) есть лимит на число одновременных соединений с сервером.

По умолчанию этот лимит равен 2 для HTTP 1.1 и 4 для HTTP 1.0.

Исправить ситуацию можно руками, вызвав при старте приложения примерно такой код:

void FixMaxConnsPerServerLimit()
{
  DWORD maxConns = 100;
  InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &maxConns, sizeof(DWORD));
  InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, &maxConns, sizeof(DWORD));
}
READ ALSO
Проблема с загрузкой изображения через WinInet[Решено]

Проблема с загрузкой изображения через WinInet[Решено]

Здравствуйте! Пытаюсь загрузить картинку логотип гугла(https://wwwgoogle

272
как вывести нормальную строку?

как вывести нормальную строку?

Всем приветСтолкнулся с проблемой

260
Как вытащить из ListView, item DynamicAppearance текст

Как вытащить из ListView, item DynamicAppearance текст

Друзья, закинул на форму 2 ListView'аУ одного тип item'а простой, а другого тип item'а DynamicAppearance и добавил несколько TTextObjectAppearance со своими названиями

279