3

在我们的程序中,每次需要发出 HTTP 请求时都会创建一个新线程,并且可以同时运行多个线程。我遇到的问题是,如果我有两个线程已经在运行,它们在InternetReadFile()调用后循环读取HttpSendRequest(),任何后续调用尝试都HttpSendRequest()挂在该调用上,所以我最终得到前面提到的两个线程继续从他们的连接中读取就好了,但第三个只是阻塞HttpSendRequest()直到超时。

根据我自己的发现,这似乎只是 wininet 的工作方式,正如HTTP 规范所建议的那样:“单用户客户端不应与任何服务器或代理保持超过 2 个连接。 "

我见过各种程序同时处理多个到同一服务器的下载,但我想他们需要做很多额外的工作才能做到这一点,比如管理各种连接或编写自己的 http 接口。

如果将其设置为处理两个以上的活动会话需要很多额外的复杂性,那么我只需将其更改为一次只处理一个或两个文件,其余的则排队。但是,如果有一些低复杂度的方法可以一次允许两个以上(在我的脑海中,我猜每次下载使用一个新进程可能会起作用,但会更麻烦),那将是可取的;无论如何,它不会同时下载超过 3-5 个,并且每次下载都是应用户的要求。我读过一些关于注册表黑客以更改限制的内容,但这绝对不是我会做的事情。有任何想法吗?

4

2 回答 2

5

HTTP 1.1 标准要求每台服务器最多同时连接 2 个。如果您安装了 IE5、IE6 或 IE7,则他们安装的 WinInet 版本允许您使用 InternetSetOption() 来增加限制(查看 INTERNET_OPTION_MAX_CONNS_PER_SERVER 和 INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER 选项)。但是,使用 IE8 安装的 WinInet 版本显然禁用了该功能(请参阅http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=434396http://connect.microsoft.com/ WNDP/feedback/ViewFeedback.aspx?FeedbackID=481485)。

于 2009-11-06T01:30:37.943 回答
-1

如果您多次调用,InternetOpen()您应该能够同时下载HINTERNET.InternetOpen()

于 2009-11-05T23:11:36.710 回答