启用 Internet 功能
在使用 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 的值必须包含以空格分隔的字符串中的代理。 代理列表可以包含用于访问代理的端口号。
若要列出特定协议的代理,字符串必须遵循格式“协议<><协议>://<proxy_name>”。 有效的协议是 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 地址可以在代理绕过列表中列出。 此列表可以包含通配符“*”,这会导致应用程序绕过代理服务器来查找符合指定模式的地址。 若要列出多个地址和主机名,请在代理旁路字符串中用分号分隔它们。 如果指定了“<local>”宏,则函数将绕过任何不包含句点的主机名的代理。
默认情况下,对于使用主机名“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("<local>"), 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) 。