启用 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 会话的情况除外。 FtpFindFirstFileFtpOpenFileHttpOpenRequest 函数使用 InternetConnect 创建的句柄与指定站点建立连接。

使用 InternetOpen

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

设置用户代理

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

设置访问类型

InternetOpen 支持三种访问类型:

  • 如果运行应用程序的系统使用与 Internet 的直接连接,请使用 INTERNET_OPEN_TYPE_DIRECT。 不使用 InternetOpenlpszProxyNamelpszProxyBypass 参数,应设置为 NULL
  • 如果运行应用程序的系统使用一个或多个代理服务器访问 Internet,请使用 INTERNET_OPEN_TYPE_PROXY。 InternetOpen 使用 lpszProxyName 指示的代理服务器,并绕过代理获取 lpszProxyBypass 指定的任何主机名或 IP 地址。
  • 使用 INTERNET_OPEN_TYPE_PRECONFIG 指示应用程序从注册表检索配置。 这通常是最佳选择,因为包括 Web 浏览器在内的大多数应用程序都使用此选项。

INTERNET_OPEN_TYPE_PRECONFIG查看注册表值 ProxyEnableProxyServerProxyOverride。 这些值位于“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings”下。

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

仅当安装了 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,则 InternetOpenlpszProxyName 参数应设置为 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 结尾的字符串的地址。 如果 lpszUsernamelpszPassword 均为 NULL,则该函数将使用默认的匿名密码。 对于 FTP,默认匿名密码是用户的电子邮件名称。 如果 lpszUsername 不是 NULLlpszPasswordNULL,则该函数使用空密码。 lpszUsernamelpszPassword 有四种可能的设置,它们生成下表所示的行为。

lpszUsername lpszPassword 发送到 FTP 服务器的用户名 发送到 FTP 服务器的密码
NULL NULL “anonymous” 用户的电子邮件名称
NULL 字符串 NULL lpszUsername ""
NULL NULL 字符串 ERROR ERROR
NULL 字符串 NULL 字符串 lpszUsername lpszPassword

可以使用 InternetSetOptionInternetErrorDlg 函数更改此信息。 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)