在我们的程序中,每次需要发出HTTP请求时都会创建一个新线程,并且可以有多个线程同时运行。我遇到的问题是,如果我已经有两个线程正在运行,它们在读取时循环InternetReadFile()
打电话后HttpSendRequest()
,任何后续尝试调用HttpSendRequest()
只需挂起该调用,因此我最终会看到前面提到的两个线程继续从其连接中读取数据,但第三个线程只是阻塞HttpSendRequest()
直到超时。
从我自己找到的情况来看,这似乎可能就是 wininet 的工作方式,因为HTTP 规范 http://www.ietf.org/rfc/rfc2616.txt建议:“单用户客户端不应与任何服务器或代理保持超过 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/feedback/ViewFeedback.aspx?FeedbackID=434396 and http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=481485 http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=481485).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)