Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 使用WinINET为虚拟用户创建健壮的HTTP连接_Winapi_Proxy_Wininet_Winhttp - Fatal编程技术网

Winapi 使用WinINET为虚拟用户创建健壮的HTTP连接

Winapi 使用WinINET为虚拟用户创建健壮的HTTP连接,winapi,proxy,wininet,winhttp,Winapi,Proxy,Wininet,Winhttp,我正在制作一个程序,使用Windows从internet下载一个简单的文件 Wininet家族API,因为我想利用其IE兼容的代理行为。大家都知道,当前的IE有几个代理设置:自动检测(WPAD)、自动配置(PAC)、手动单个URL、每个协议的代理服务器、socks、direct等等。。。对大多数用户来说,“直接下载”效果不错;但是,对于某些用户(尤其是防火墙/NAT后面的用户),他们在建立连接时总是需要特殊的代理设置 编写代码来处理所有这些情况是很痛苦的,所以我希望带有InternetOpen(

我正在制作一个程序,使用Windows从internet下载一个简单的文件 Wininet家族API,因为我想利用其IE兼容的代理行为。大家都知道,当前的IE有几个代理设置:自动检测(WPAD)、自动配置(PAC)、手动单个URL、每个协议的代理服务器、socks、direct等等。。。对大多数用户来说,“直接下载”效果不错;但是,对于某些用户(尤其是防火墙/NAT后面的用户),他们在建立连接时总是需要特殊的代理设置

编写代码来处理所有这些情况是很痛苦的,所以我希望带有
InternetOpen(INTERNET\u OPEN\u TYPE\u prefig)
的WinINET能够帮助我。大多数用户都是这样,但是我仍然发现一些用户抱怨连接失败。这些用户可能有非常特殊的网络环境(例如,代理需要用户名/密码验证),直接连接对他们不起作用

有时虚拟用户的配置错误,我希望wininet为我尝试“所有”可能的代理设置;不幸的是,
INTERNET\u OPEN\u TYPE\u prefig
只会尝试用户配置的配置,而不是“所有可能的代理设置”

所以我的问题是,我如何为虚拟用户(也就是说,他们不知道如何配置他们的系统)制作一个最有能力绕过所有http连接(特别是代理配置)的程序?
有没有任何建议的方法可以在不需要处理代理的情况下建立HTTP连接?(即,“超级”连接求解器将尝试所有可能的代理设置),或者如果有任何方法告诉WinINET启用其所有代理设置以创建连接?

合理的算法如下:

  • 使用用户当前的代理设置(IE使用的设置)尝试连接。这些是最有可能发挥作用的。请参阅MSDN上的以获取这些设置,或在WinINet中的
    INTERNET\u OPEN\u TYPE\u prefig

  • 如果失败,请尝试直接连接

  • 如果失败,请尝试使用WPAD自动检测。(是客户端可以在网络(通常是公司网络)上自动查找文件的方式。)您需要选择该选项以检查代理文件的DHCP和DNS。在MSDN上包含使用此API的代码示例和大量支持信息。如果成功,您将获得代理信息,然后可以插入HTTP下载代码。顺便说一句,没有等效的WinINet选项自动执行新的WPAD检测——只有WinHTTP

  • 接下来,您可以尝试查找Firefox代理设置。有关这些设置的位置和格式的详细信息,以便您可以通过编程方式访问它们

  • 如果仍然失败,请让用户(在您的UI中)检查他们的internet连接是否已实际连接。实际上,用户断开连接比上述所有代理检测步骤都失败要常见得多。要求用户打开他们的浏览器,以确保他们能够访问internet站点——如果上述步骤失败,他们的浏览器可能无法看到web。一旦用户声称已连接,重复步骤1-3

  • 如果上述所有操作都失败了,那么您除了要求用户手动指定其代理信息之外,实在别无选择。您可能希望克隆IE或firefox的代理UI,并将这些UI设置转换为相应的参数,以便在下载该文件时配置代理选项

  • 请注意,代理检测没有什么神奇之处——您可以选择使用用户设置、使用默认计算机设置、使用直接连接、使用WPAD查找PAC文件或询问用户。不幸的是,没有办法“在不需要处理代理的情况下进行HTTP连接”

    顺便说一句,尽管您可以仅将WinHTTP用于代理检测,然后使用WinINet获取文件,但我建议对这两部分都使用WinHTTP。当您希望对HTTP交互具有最大的灵活性和控制(以及比WinINet更好的稳定性)时,WinHTTP是首选

    更新2:

    J.J.在上面有一个好主意——我添加了一个检查Firefox代理设置的步骤。由于古怪的代理通常出现在公司环境中(倾向于在IE上标准化),所以这不太可能有帮助,但值得一试

    更新:我刚刚编辑了上面的部分,以回应Francis的正确评论:WinHTTP不是严格意义上的WinINet的“继承者”(意味着WinINet的100%功能在WinHTTP中可用)。相反,WinHTTP是为使用HTTP进行数据交换的应用而设计的,它不关心与Interet Explorer的缓存、cookies、拨号用户界面等的集成

    服务器应用肯定属于这一类(WinHTTP与WinINet不同,在服务器应用中使用是安全的),但许多客户端软件也使用它,例如每台现代PC上的Windows Update客户端。一般来说,WinHTTP更适合于需要通过HTTP下载文件、需要对网络进行更细粒度控制并希望控制自己的UI的客户端应用程序


    WinHTTP更易于操作(例如,您需要调用一个API来获取代理信息,再调用另一个API来使用该代理信息),但这种额外的控制程度允许您执行WinINet无法执行的操作,比如强制忽略用户的代理设置并尝试新的WPAD检测。

    我发现IE本身使用的过程的最佳描述是。使用IE访问Windows Update时,请结合您对WinINet或WinHTTP的了解,并连接应用程序

    以下是知识库文章的顺序:

  • 如果用户配置为自动检测设置,请使用WPAD查找PAC文件
  • 找不到PAC文件?如果用户设置了IE自动配置脚本,则使用该PAC文件