Блокировка HttpSendRequest, когда уже выполняется более двух загрузок
В нашей программе новый поток создается каждый раз, когда требуется выполнить HTTP-запрос, и одновременно может выполняться несколько потоков. У меня проблема в том, что если у меня уже запущены два потока, где они зацикливаются на чтение из InternetReadFile()
после звонка HttpSendRequest()
, любые последующие попытки позвонить HttpSendRequest()
просто прервите этот вызов, так что я получаю два упомянутых ранее потока, которые продолжают нормально читать их соединения, но третий просто блокирует HttpSendRequest()
пока не истечет время.
Из того, что я смог найти самостоятельно, похоже, что именно так может работать wininet, поскольку в спецификации HTTP рекомендуется: "Однопользовательскому клиенту НЕ СЛЕДУЕТ поддерживать более двух соединений с любым сервером или прокси-сервером."
Я видел, как различные программы обрабатывают несколько одновременных загрузок на один и тот же сервер, но я полагаю, что им нужно проделать большую дополнительную работу для этого, с точки зрения управления различными соединениями или написания собственного http-интерфейса.
Если для настройки более чем двух активных сессий потребуется много дополнительной сложности, то я просто изменил бы все, чтобы обрабатывать только один или два файла за раз, оставляя остальные в очереди. Однако, если бы существовал какой-то простой способ разрешить более двух одновременных операций (вне головы, я бы предположил, что использование нового процесса для каждой загрузки может работать, но будет более грязным), это было бы предпочтительным; Это не значит, что в любом случае будет загружаться более 3-5 одновременно, и каждая загрузка осуществляется по запросу пользователя. Я прочитал некоторые упоминания о взломах реестра, чтобы изменить ограничение, но я определенно не буду этим заниматься. Есть идеи?
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).
Если вы позвоните InternetOpen()
несколько раз, вы должны иметь возможность одновременно загружать два файла на каждом HINTERNET
вернулся InternetOpen()
,