Блокировка HttpSendRequest, когда уже выполняется более двух загрузок

В нашей программе новый поток создается каждый раз, когда нужно сделать HTTP-запрос, и их может быть несколько одновременно. Проблема, с которой я сталкиваюсь, заключается в том, что если у меня уже есть два потока, в которых они зацикливаются на чтении из InternetReadFile() после вызова HttpSendRequest(), любые последующие попытки вызвать HttpSendRequest() просто зависают на этом вызове, поэтому я получаю ранее упомянутое два потока продолжают нормально читать из своих соединений, но третий просто блокируется на HttpSendRequest(), пока не истечет время ожидания.

Из того, что мне удалось найти самостоятельно, похоже, что это может быть просто способ работы wininet, поскольку спецификация HTTP рекомендует: "Однопользовательский клиент НЕ ДОЛЖЕН поддерживать более двух соединений с любым сервером или прокси".

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

Если бы потребовалась большая дополнительная сложность, чтобы настроить его для обработки более двух активных сеансов, я бы просто изменил вещи, чтобы обрабатывать только один или два файла за раз, оставив остальные в очереди. Однако, если бы существовал какой-то несложный способ разрешить более двух за раз (я думаю, что использование нового процесса для каждой загрузки может сработать, но было бы более беспорядочно), это было бы предпочтительнее; в любом случае, это не значит, что будет загружаться более 3-5 одновременно, и каждая загрузка осуществляется по запросу пользователя. Я читал некоторые упоминания о взломе реестра, чтобы изменить ограничение, но это определенно не то, что я бы сделал. Любые идеи?


person Doug Kavendek    schedule 05.11.2009    source источник


Ответы (2)


Стандарт HTTP 1.1 требует максимум 2 одновременных подключения к серверу. Если у вас установлен IE5, IE6 или IE7, версии WinInet, которые они устанавливают, позволяют использовать InternetSetOption() для увеличения лимита (см. параметры INTERNET_OPTION_MAX_CONNS_PER_SERVER и INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER). Однако версия WinInet, установленная вместе с IE8, по-видимому, отключает эту функцию (см. ">http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=434396 и http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=481485).

person Remy Lebeau    schedule 06.11.2009
comment
Спасибо, это дает мне гораздо больше информации, даже если я не смогу использовать это конкретное решение из-за изменений в IE8. Я не знаю, почему я не смог найти ничего из этого в своем поиске, но я думаю, что искал не в том месте. - person Doug Kavendek; 06.11.2009
comment
На самом деле, после тестирования, хотя у меня установлен IE8, я могу установить максимальное количество подключений более двух, и это работает (InternetQueryOption возвращает значение, которое я установил, и я действительно могу иметь указанное количество одновременных подключений) . Возможно, в недавнем обновлении его опять поменяли, но подтверждений этому я не нашел. И я полагаю, если у кого-то есть IE8, то они, вероятно, уже регулярно обновляются, поэтому, если это было исправлено, то мне следует установить. - person Doug Kavendek; 07.11.2009

Если вы вызываете InternetOpen() несколько раз, вы сможете одновременно загрузить два файла на каждый HINTERNET, возвращенный InternetOpen().

person Steve K    schedule 05.11.2009
comment
Я пробовал как повторно использовать дескриптор HINTERNET, открытый из InternetOpen(), так и открывать новый для каждого соединения, но в любом случае он по-прежнему ограничивает количество активных соединений двумя, и я пытаюсь выяснить, есть ли способ увеличить этот предел. - person Doug Kavendek; 06.11.2009
comment
Да, многократный вызов InternetOpen не увеличивает количество одновременных подключений. - person bpeikes; 15.03.2018