启用 Internet 功能 - Win32 apps

启用 Internet 功能 - Win32 apps

在使用 WinINet 函数之前,应用程序应尝试使用 InternetAttemptConnect 函数建立与 Internet 的连接。 此函数调用拨号对话框以启动与 Internet 的连接,如果连接已存在,则检查。 如果此函数失败,应用程序可以进入脱机模式,这允许它访问以前连接到 Internet 期间缓存的信息。

使用 InternetCheckConnection 函数检查与 Internet 的连接。 它尝试 ping 由传递给函数的 URL 指定的服务器。 如果设置了FLAG_ICC_FORCE_CONNECTION标志,并且 URL 为 NULL,则函数将检查服务器数据库中是否存在最近的服务器的条目。 如果存在,函数会 ping 该服务器。

接下来,使用 InternetOpen 函数建立客户端应用程序正在使用的 Internet 连接的特征。

InternetOpen 创建用于建立 httpftp 会话的根 HINTERNET 句柄。

InternetOpen 不会测试与 Internet 的连接,以验证传递给函数的特征是否正确。

使用 InternetConnect 函数创建特定会话。

InternetConnect 使用传递给指定的站点的参数初始化会话,并创建一个 HINTERNET 句柄,该句柄是根句柄的分支。

InternetConnect 不会尝试访问或建立与指定站点的连接,FTP 会话的情况除外。

FtpFindFirstFile、 FtpOpenFile 和 HttpOpenRequest 函数使用 InternetConnect 创建的句柄与指定站点建立连接。

使用 InternetOpen

若要启用与 Internet 的连接,必须使用 InternetOpen 创建根 HINTERNET 句柄。 有关用户代理的信息 (调用 Internet 函数的应用程序) 、对 Internet 的访问类型、代理名称、绕过代理的主机和地址以及行为传递给 InternetOpen。

设置用户代理

调用应用程序应为包含访问 Internet 的应用程序或实体名称的字符串提供 InternetOpen 的 lpszAgent 参数。 此字符串用作 HTTP 协议中的用户代理。 例如,Microsoft Internet Explorer 使用“Microsoft Internet Explorer”。

设置访问类型

InternetOpen 支持三种访问类型:

如果运行应用程序的系统使用与 Internet 的直接连接,请使用 INTERNET_OPEN_TYPE_DIRECT。 不使用 InternetOpen 的 lpszProxyName 和 lpszProxyBypass 参数,应设置为 NULL。

如果运行应用程序的系统使用一个或多个代理服务器访问 Internet,请使用 INTERNET_OPEN_TYPE_PROXY。

InternetOpen 使用 lpszProxyName 指示的代理服务器,并绕过代理获取 lpszProxyBypass 指定的任何主机名或 IP 地址。

使用 INTERNET_OPEN_TYPE_PRECONFIG 指示应用程序从注册表检索配置。 这通常是最佳选择,因为包括 Web 浏览器在内的大多数应用程序都使用此选项。

INTERNET_OPEN_TYPE_PRECONFIG查看注册表值 ProxyEnable、 ProxyServer 和 ProxyOverride。 这些值位于“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings”下。

如果 ProxyEnable 为零,则应用程序使用 INTERNET_OPEN_TYPE_DIRECT。 否则,应用程序使用 INTERNET_OPEN_TYPE_PROXY 并使用 ProxyServer 和 ProxyOverride 信息。

仅当安装了 Internet Explorer 时,WinINet 函数才支持 SOCKS 类型代理。 Internet Explorer 的安装包括支持 SOCKS 代理所需的 Wsock32n.dll 文件。 Wsock32n.dll 不可再发行。

列出代理服务器

WinINet 识别两种类型的代理:CERN 类型代理 (HTTP 仅) ,TIS FTP 代理仅 (FTP) 。 如果安装了 Internet Explorer,WinINet 还支持 SOCKS 类型代理。

InternetConnect 默认假定指定的代理是 CERN 代理。 如果访问类型设置为 INTERNET_OPEN_TYPE_DIRECT 或 INTERNET_OPEN_TYPE_PRECONFIG,则 InternetOpen 的 lpszProxyName 参数应设置为 NULL。 否则,传递给 lpszProxyName 的值必须包含以空格分隔的字符串中的代理。 代理列表可以包含用于访问代理的端口号。

若要列出特定协议的代理,字符串必须遵循格式“协议<><协议>://”。 有效的协议是 HTTP、HTTPS 和 FTP。 例如,若要列出 FTP 代理,有效的字符串为“”ftp=ftp://ftp_proxy_name:21“”,其中 ftp_proxy_name 是 FTP 代理的名称,21 是必须用于访问代理的端口号。 如果代理使用该协议的默认端口号,则可以省略端口号。 如果代理名称本身列出,则它将用作未指定特定代理的任何协议的默认代理。 例如,“http=https://http_proxy other”将http_proxy用于任何 HTTP 操作,而所有其他协议将使用其他协议。

默认情况下,函数假定 lpszProxyName 指定的代理是 CERN 代理。 应用程序可以指定多个代理,包括不同协议的不同代理。 例如,如果指定“”ftp=ftp://ftp-gw HTTP=https://jericho:99 proxy“,则 FTP 请求通过 ftp-gw 代理进行,该代理侦听端口 21,HTTP 请求通过名为 jericho 的 CERN 代理发出,该代理在端口 99 上侦听。 否则,HTTP 请求将通过名为 proxy 的 CERN 代理发出,代理侦听端口 80。 请注意,例如,如果应用程序仅使用 FTP,则无需指定“”ftp=ftp://ftp-gw:21”。 它可以仅指定“ftp-gw”。 仅当应用程序对 InternetOpen 返回的每个句柄使用多个协议时,才需要指定协议名称。

列出代理绕过

不应发送到代理的主机名或 IP 地址可以在代理绕过列表中列出。 此列表可以包含通配符“*”,这会导致应用程序绕过代理服务器来查找符合指定模式的地址。 若要列出多个地址和主机名,请在代理旁路字符串中用分号分隔它们。 如果指定了“”宏,则函数将绕过任何不包含句点的主机名的代理。

默认情况下,对于使用主机名“localhost”、“loopback”、“127.0.0.1”或“[::1]”的请求,WinINet 将绕过代理。 之所以存在此行为,是因为远程代理服务器通常无法正确解析这些地址。

Internet Explorer 9:可以使用“-loopback>”<宏从代理绕过列表中删除本地计算机。

以下示例演示使用不同的代理绕过字符串对 InternetOpen 的示例调用。 上述每个调用的注释描述了绕过字符串对从它创建的 HINTERNET 句柄访问的主机名的影响。

HINTERNET hInternetRoot;

/* bypass the proxy for any host name that does not

contain a period */

hInternetRoot = InternetOpen(TEXT("WinInet Example"),

INTERNET_OPEN_TYPE_PROXY,TEXT("proxy"),TEXT(""), 0);

/* bypass the proxy for any host name that starts with the

letters "ms" */

hInternetRoot = InternetOpen(TEXT("WinInet Example"),

INTERNET_OPEN_TYPE_PROXY,TEXT("proxy"),TEXT("ms*"), 0);

/* bypass the proxy for any host name that contains "int",

such as "internet" and "painter" */

hInternetRoot = InternetOpen(TEXT("WinInet Example"),

INTERNET_OPEN_TYPE_PROXY,TEXT("proxy"),TEXT("*int*"), 0);

/* bypass the proxy for the host name "example" and any

host name that contains "test" */

hInternetRoot = InternetOpen(TEXT("WinInet Example"),

INTERNET_OPEN_TYPE_PROXY,TEXT("proxy"),TEXT("example *test*"), 0);

/* Disable the loopback proxy bypass for localhost */

hInternetRoot = InternetOpen(TEXT("WinInet Example"),

INTERNET_OPEN_TYPE_PROXY,TEXT("127.0.0.1:8888"),TEXT("<-loopback>"), 0);

使用 InternetConnect

若要开始会话, InternetConnect 函数必须从 InternetOpen 函数返回的根句柄上创建句柄。

InternetConnect 设置服务器地址、端口号、用户名、密码和服务类型。

InternetConnect 使用 InternetOpen 创建的根 HINTERNET 句柄来建立会话句柄。 如果在对 InternetOpen 的调用中设置了INTERNET_FLAG_ASYNC标志,则对 InternetConnect 的调用应包含非零上下文值。

服务器名称可以包含主机名 (例如,“www.servername.com”) 或站点的 IP 编号(ASCII 点十进制格式 (例如“10.0.1.45”) )。

服务器端口是传输控制协议/Internet 协议 (TCP/IP) 要连接到服务器上的端口号。 如果使用INTERNET_INVALID_PORT_NUMBER值,InternetConnect 将使用所选服务类型的默认端口。 下表包含 WinINet 的服务器端口默认值。

含义

INTERNET_DEFAULT_FTP_PORT

使用 ftp 服务器的默认端口 (端口 21) 。

INTERNET_DEFAULT_GOPHER_PORT

使用 gopher 服务器的默认端口 (端口 70) 。

注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。

INTERNET_DEFAULT_HTTP_PORT

使用 http 服务器的默认端口 (端口 80) 。

INTERNET_DEFAULT_HTTPS_PORT

使用 https 服务器的默认端口 (端口 443) 。

INTERNET_DEFAULT_SOCKS_PORT

使用 SOCKS 防火墙服务器的默认端口 (端口 1080) 。

定义用户名和密码

lpszUsername 的值是包含登录用户姓名的以 null 结尾的字符串的地址。 如果此参数为 NULL,则函数使用适当的默认值(HTTP 除外)。 HTTP 中的 NULL 参数会导致服务器返回错误。 对于 FTP 协议,默认值为匿名。

lpszPassword 的值是包含登录密码的以 null 结尾的字符串的地址。 如果 lpszUsername 和 lpszPassword 均为 NULL,则该函数将使用默认的匿名密码。 对于 FTP,默认匿名密码是用户的电子邮件名称。 如果 lpszUsername 不是 NULL 且 lpszPassword 为 NULL,则该函数使用空密码。

lpszUsername 和 lpszPassword 有四种可能的设置,它们生成下表所示的行为。

lpszUsername

lpszPassword

发送到 FTP 服务器的用户名

发送到 FTP 服务器的密码

NULL

NULL

“anonymous”

用户的电子邮件名称

非 NULL 字符串

NULL

lpszUsername

""

NULL

非 NULL 字符串

ERROR

ERROR

非 NULL 字符串

非 NULL 字符串

lpszUsername

lpszPassword

可以使用 InternetSetOption 和 InternetErrorDlg 函数更改此信息。

InternetSetOption 更改用户名和密码值,而 InternetErrorDlg 将显示一个对话框,请求正确的用户名和密码。

定义会话

若要定义正在建立的会话,请设置 InternetConnect 的服务类型、标志和上下文值。

InternetConnect 有两种服务类型:INTERNET_SERVICE_FTP和INTERNET_SERVICE_HTTP。 INTERNET_SERVICE_HTTP同时用于 HTTP 和 HTTPS 会话。

INTERNET_FLAG_PASSIVE 是 WinINet 函数使用的唯一特定于服务的标志。 当服务类型INTERNET_SERVICE_FTP时,可以设置此标志,以便使用被动 FTP 语义。

对于所有同步操作, dwContext 的值应设置为零。 如果在调用 InternetOpen 时设置INTERNET_FLAG_ASYNC标志建立了异步操作,则应为 dwContext 提供非零值。 有关异步操作的详细信息,请参阅 设置异步操作。

对于 FTP 会话, InternetConnect 会尝试在 Internet 上建立与服务器的连接。 对于 HTTP 会话, InternetConnect 不会建立连接,直到另一个函数尝试从服务器获取信息。

注意

WinINet 不支持服务器实现。 此外,不应从服务使用它。 对于服务器实现或服务,请使用 Microsoft Windows HTTP Services (WinHTTP) 。

相关推荐