【发布时间】:2015-08-12 18:46:03
【问题描述】:
我对使用 wininet.dll 函数 InternetOpen 的应用程序有疑问。
简单地说,在某些机器上,第一次调用 InternetOpenW 需要很长时间才能返回(20 到 60 秒)。 在其他机器上,它几乎是瞬时的。
到目前为止,这只发生在 Windows 7 机器上,我尝试过的所有 Windows 8 电脑都没有问题,但我只能访问 3... Windows 7 机器的设置都非常相似,虽然不完全相同:Windows 7 Ultimate 64 位、SP1、IE 11(wininet.dll 版本 11.0.9600.17840)。我还检查了 ProxyEnable、ProxyServer 和 ProxyOverride(InternetOpen 会根据参数进行检查)的注册表值,并且它们匹配(此外,没有使用代理)。
我已确保所有机器都没有病毒和恶意软件。我已经确定 wininet.dll 是同一个版本,比较了运行 Windows NT 服务的列表,尝试从安全模式。 “受影响”的机器上没有区别。
我相当有信心这与代码本身没有任何关系。它是用 Delphi XE5 编写的。事实上,如果我使用一些也调用 InternetOpenW 函数的组件,它们在受影响的机器上也会出现同样的问题。
受影响的机器一直受到影响,“正常”的机器总是可以正常工作。 IE 本身在受影响的机器上看起来并不慢。
有什么想法吗?
谢谢!
编辑回应戴维·钦
感谢您的提示。我在受影响和未受影响的机器上都安装了 Wireshark,并将结果与一个向 maps.googleapi.com 服务器发出 HTTPS 请求的简单应用程序进行了比较。
我没有注意到任何服务器本身挂起。但是,我们网络的外部 IP 地址有一些 TCP 数据包。就好像这些调用正在延迟/阻塞应用程序的流量。
奇怪的是,目标 IP 地址目前没有被使用——我使用的是 Cisco rv320 路由器,它允许双 WAN 连接。 IP地址是备用互联网服务,但它目前没有连接到路由器,事实上,该连接目前没有建立,所以路由器没有(或至少不应该)知道它。但是,当我们的主要互联网连接失败时,该地址已在 3 周前使用(但在那之后重新配置了路由器)。 此外,如果问题来自路由器,我希望网络上的所有机器都有相同的问题,但事实并非如此 - 来自“未受影响”机器的 wireshark 捕获不显示这些数据包(至少在少数我捕获的秒数)。
任何想法从这里去哪里,恐怕我不是网络专家。
谢谢!
【问题讨论】:
-
运行 Wireshark 或 MS 消息分析器,查看正在访问的服务器需要像这样超时。
-
@David Ching:感谢您的建议。我发现一些对我来说似乎“奇怪”的数据包(请参阅我的编辑),但我不知道如何修复它,或者它是否相关。有什么想法吗?
-
在受影响的机器上打开控制面板中的 Internet 设置,查看是否为您的备份站点设置了代理。 WinInet 和 IE 都使用这些设置。不过,非常奇怪的 IE 从未受到影响。
-
@David Ching:不,那里没有设置代理。我什至重置了整个选项,恢复到 IE 8 并升级回来,浏览了每个版本的 IE,直到 IE 11。困惑...
-
您可以使用API Monitor 查看您的应用程序调用的 WinInet 和较低级别的 API,并将它们与 IE 调用它们的方式进行比较。也许您需要调用InternetSetOption 来设置一些特定于连接的设置。
标签: windows winapi delphi-xe5