当两个以上的下载已经在进行时 HttpSendRequest 阻塞

Posted

技术标签:

【中文标题】当两个以上的下载已经在进行时 HttpSendRequest 阻塞【英文标题】:HttpSendRequest blocking when more than two downloads are already in progress 【发布时间】:2009-11-05 20:56:37 【问题描述】:

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

从我自己找到的情况来看,这似乎只是 wininet 的工作方式,正如the HTTP spec 建议的那样:“单用户客户端不应与任何服务器保持超过 2 个连接或代理。”

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

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

【问题讨论】:

【参考方案1】:

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=481485)。

【讨论】:

谢谢,这给了我更多信息,即使由于 IE8 的变化我可能无法使用该特定解决方案。我不知道为什么我在搜索中找不到任何这些,但我想我没有找对地方。 实际上,经过测试,虽然我安装了IE8,但我可以将最大连接数设置为两个以上,并且可以正常工作(InternetQueryOption返回我设置的值,我实际上能够具有指定数量的同时连接)。也许它在最近的更新中再次被更改,但我还没有找到任何确认。我想,如果有人有 IE8,那么他们可能已经定期更新,所以如果它已经修复,那么我应该设置。【参考方案2】:

如果您多次调用InternetOpen(),您应该能够同时下载InternetOpen()返回的每个HINTERNET上的两个文件。

【讨论】:

我已经尝试过重用从 InternetOpen() 打开的 HINTERNET 句柄,并为每个连接打开一个新句柄,但无论哪种方式,它仍然将活动连接数限制为两个,我正在尝试想办法增加这个限制。 是的,多次调用 InternetOpen 不会增加同时连接数。

以上是关于当两个以上的下载已经在进行时 HttpSendRequest 阻塞的主要内容,如果未能解决你的问题,请参考以下文章

当结构有两个以上参数时,带有 array.push() 的 Solidity 函数不起作用

如何在两个以上的画布中绘制 HTML 和 JS

在一台电脑上运行两个或两个以上的tomcat

怎么实现web端上传超大文件,下载断点续传

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

MySQL锁(死锁)