c++ - InternetOpenUrl 间歇性超时

标签 c++ winapi activex fiddler

我有一些异常超时的 InternetOpenUrl 请求。端点在那里,URL 是正确的。这发生在 activex 控件内的同步循环中,大约在第 6 次执行时,它在没有访问服务器的情况下超时。

HINTERNET hINet = InternetOpen(TEXT("InetURL/1.0"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
/*hangs*/ HINTERNET hFile = InternetOpenUrl( hINet, url.c_str(), headers, headersLen, dwFlags, dwContext);

GetLastError 只是返回 12002 操作超时。这是完整的片段:http://gist.github.com/559317

有趣的是,如果我将 InternetOpen 标志更改为 INTERNET_OPEN_TYPE_DIRECT,并且 fiddler 没有运行,我会失败(在几次成功请求之后),如果我运行 fiddler,所有请求都会成功。

目前已经在Win7/IE8、Vista64/IE8、XP/IE6上复制

最佳答案

您几乎肯定会达到 WinINET 中的“每台主机的连接数”限制。

根据 RFC2616 中的每主机连接数,您只能对并行运行的单个主机发出一定数量的请求。当达到上限时,WinINET 将对挂起的请求进行排队,直到现有连接可用为止。如果在达到超时之前没有可用连接,则请求超时。

WinINET 在每个端点的基础上实现此限制,因此当您使用代理(如 Fiddler、ISA、SQUID 等)运行时,一次最多可以有“n”个事件连接,而如果没有代理,那么每个主机名最多可以有“n”个连接。

如果您的 ActiveX 控件在响应完成时没有正确释放连接,那么您可能会遇到这个问题。通常,运行 Fiddler 不应为您“修复”该问题,但您可以使用 NetMon 检查发生了什么。

关于c++ - InternetOpenUrl 间歇性超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3611132/

相关文章:

c++ - 性能差异调试与发布

c++ - 生成具有差异约束的随机整数

com - C# COM DLL : do I use Regasm, 或 Regsvr32?

python - ActiveX 对象的 PyQt5 包装器而不是 WX 包装器

activex - 签署 cab 文件

c++ - twitcurl OAuth - 错误 89 : Invalid/Expired Token

c++ - Python.h 的 undefined symbol

c++ - 转换 "application's"内存地址

c++ - CreateHwndRenderTarget引发异常:读取访问冲突。 **这**是nullptr

c++ - 使用 VirtualDisk API 创建 VHD 文件