在我们的程序中,每次需要发出HTTP请求时都会创建一个新线程,并且可以有多个线程同时运行。我遇到的问题是,如果我已经有两个线程正在运行,它们在InternetReadFile()调用后循环读取HttpSendRequest(),任何后续的调用尝试HttpSendRequest()都会挂在该调用上,所以我最终会继续前面提到的两个线程从它们的连接中读取数据就可以了,但是第三个连接会一直阻塞,HttpSendRequest()直到超时。
从我自己找到的情况来看,这似乎就是 wininet 的工作方式,正如HTTP 规范所建议的那样:“单用户客户端不应与任何服务器或代理保持超过 2 个连接。 ”
我见过各种程序处理对同一服务器的多个同时下载,但我想他们需要做很多额外的工作才能做到这一点,在管理各种连接或编写自己的 http 接口方面。
如果需要大量额外的复杂性来将其设置为处理两个以上的活动会话,那么我只需将其更改为一次仅处理一两个文件,而将其余文件留在队列中。然而,如果有一些低复杂性的方法允许一次超过两个(我想,我猜每次下载使用一个新进程可能会起作用,但会更混乱),那就更好了;无论如何,它不会同时下载超过 3-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=434396和http://connect.microsoft.com/ WNDP/反馈/ViewFeedback.aspx?FeedbackID=481485 )。
| 归档时间: |
|
| 查看次数: |
3362 次 |
| 最近记录: |