Поделиться через


Включение функциональных возможностей Интернета

Перед использованием функций WinINet приложение должно попытаться установить подключение к Интернету с помощью функции InternetAttemptConnect . Эта функция вызывает диалоговое окно удаленного доступа, чтобы инициировать подключение к Интернету или проверка, если подключение уже существует. Если эта функция завершается сбоем, приложение может перейти в автономный режим, который позволяет ему получать доступ к сведениям, кэшируемым во время предыдущих подключений к Интернету.

Используйте функцию InternetCheckConnection для проверка подключения к Интернету. Он пытается установить связь с сервером, указанным URL-адресом, который передается функции. Если установлен флаг FLAG_ICC_FORCE_CONNECTION и URL-адрес имеет значение NULL, функция проверяет наличие записи в базе данных сервера для ближайшего сервера. Если он существует, функция проверяет связь с этим сервером.

Затем используйте функцию InternetOpen , чтобы установить характеристики подключения к Интернету, используемого клиентским приложением. InternetOpen создает корневой дескриптор HINTERNET , который используется для установки сеансов HTTPFTP . InternetOpen не проверяет подключение к Интернету, чтобы убедиться, что характеристики, передаваемые функции, верны.

Используйте функцию InternetConnect для создания определенного сеанса. InternetConnect инициализирует сеанс для указанного сайта, используя переданные ему аргументы, и создает дескриптор HINTERNET , который является ветвью от корневого дескриптора. InternetConnect не пытается получить доступ к указанному сайту или установить подключение к ней, за исключением сеанса FTP. Функции FtpFindFirstFile, FtpOpenFile и HttpOpenRequest используют дескриптор, созданный InternetConnect, для установки подключения к указанному сайту.

Использование ИнтернетаОткрыть

Чтобы включить подключение к Интернету, необходимо создать корневой дескриптор HINTERNET с помощью InternetOpen. Сведения об агенте пользователя (приложение, вызывающее функции Интернета), типе доступа к Интернету, имена прокси-сервера, узлы и адреса, которые обходят прокси-сервер, а также о поведении передаются в InternetOpen.

Настройка агента пользователя

Вызывающее приложение должно предоставить строку, содержащую имя приложения или сущности, обращающуюся к Интернету, параметру lpszAgentобъекта InternetOpen. Эта строка используется в качестве агента пользователя в протоколе HTTP. Например, Microsoft Internet Обозреватель использует "Microsoft Internet Обозреватель".

Настройка типов доступа

InternetOpen поддерживает три типа доступа:

  • Используйте INTERNET_OPEN_TYPE_DIRECT, если система, в которой выполняется приложение, использует прямое подключение к Интернету. Параметры lpszProxyName и lpszProxyBypassобъекта InternetOpen не используются и должны иметь значение NULL.
  • Используйте INTERNET_OPEN_TYPE_PROXY, если система, в которой выполняется приложение, использует один или несколько прокси-серверов для доступа к Интернету. InternetOpen использует прокси-серверы, указанные lpszProxyName , и обходит прокси-сервер для всех имен узлов или IP-адресов, указанных в lpszProxyBypass.
  • Используйте INTERNET_OPEN_TYPE_PRECONFIG, чтобы указать приложению получить конфигурацию из реестра. Как правило, это лучший выбор, так как большинство приложений, включая веб-браузеры, используют этот вариант.

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 .

Функции WinINet обеспечивают поддержку прокси-серверов типа SOCKS, только если установлено интернет-Обозреватель. Установка интернет-Обозреватель включает файл Wsock32n.dll, необходимый для поддержки прокси-серверов SOCKS. Wsock32n.dll не является распространяемым.

Вывод списка прокси-серверов

WinINet распознает два типа прокси-серверов: прокси типа CERN (только HTTP) и прокси-серверы FTP TIS (только FTP). Если установлено интернет-Обозреватель, WinINet также поддерживает прокси-серверы типа SOCKS. InternetConnect предполагает, что по умолчанию указанный прокси-сервер является прокси-сервером CERN. Если для типа доступа задано значение INTERNET_OPEN_TYPE_DIRECT или INTERNET_OPEN_TYPE_PRECONFIG, параметру lpszProxyNameобъекта InternetOpen должно быть присвоено значение 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-запросы — через прокси-сервер CERN с именем jericho, который прослушивает порт 99. В противном случае HTTP-запросы будут выполняться через прокси-сервер CERN, который прослушивает порт 80. Обратите внимание, что, например, если приложение использует только FTP, ему не нужно указывать ""ftp=ftp://ftp-gw:21"". Он может указать только "ftp-gw". Приложение должно указывать имена протоколов только в том случае, если оно использует несколько протоколов на дескриптор, возвращаемый InternetOpen.

Вывод списка обхода прокси-сервера

Имена узлов или IP-адреса, которые не следует отправлять на прокси-сервер, можно включить в список обхода прокси-сервера. Этот список может содержать подстановочные знаки "*", которые приводят к тому, что приложение будет обходить прокси-сервер для адресов, которые соответствуют указанному шаблону. Чтобы вывести список нескольких адресов и имен узлов, разделите их точкой с запятой в строке обхода прокси-сервера. Если указан "локальный<>" макрос, функция обходит прокси-сервер для любого имени узла, не содержащего точку.

По умолчанию WinINet будет обходить прокси-сервер для запросов, использующих имена узлов "localhost", "loopback", "127.0.0.1" или "[::1]". Такое поведение связано с тем, что удаленный прокси-сервер обычно не разрешает эти адреса должным образом.

Internet Обозреватель 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 использует корневой дескриптор HINTERNET , созданный InternetOpen , для установки дескриптора сеанса. Если флаг INTERNET_FLAG_ASYNC был установлен в вызове InternetOpen, вызов InternetConnect должен содержать ненулевое значение контекста.

Имя сервера может содержать имя узла (например, "www.servername.com") или IP-номер сайта в формате ASCII с точками в десятичном формате (например, "10.0.1.45").

Порт сервера — это номер порта TCP/IP, к которому необходимо подключиться на сервере. InternetConnect использует порт по умолчанию для выбранного типа службы, если используется значение INTERNET_INVALID_PORT_NUMBER. В следующих таблицах содержатся значения по умолчанию для портов сервера для 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, функция использует соответствующее значение по умолчанию, за исключением HTTP. Параметр NULL в HTTP приводит к тому, что сервер возвращает ошибку. Для протокола FTP значение по умолчанию является анонимным.

Значение lpszPassword — это адрес строки, завершающейся нулевым значением, которая содержит пароль для входа. Если и lpszUsername , и lpszPassword имеют значение NULL, функция использует анонимный пароль по умолчанию. В случае FTP анонимным паролем по умолчанию является имя электронной почты пользователя. Если lpszUsername не равно NULL , а lpszPassword имеет значение NULL, функция использует пустой пароль. Существует четыре возможных параметра lpszUsername и lpszPassword, которые создают поведение, показанное в следующей таблице.

lpszUsername lpszPassword Имя пользователя, отправленное на FTP-сервер Пароль, отправленный на FTP-сервер
NULL NULL "anonymous" Имя электронной почты пользователя
Строка, отличной от NULL NULL lpszUsername ""
NULL Строка, отличной от NULL ОШИБКА ОШИБКА
Строка, отличной от 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 должно быть равно нулю. Если асинхронные операции были установлены путем установки флага INTERNET_FLAG_ASYNC в вызове InternetOpen, для dwContext должно быть указано ненулевое значение. Дополнительные сведения об асинхронных операциях см. в разделе Настройка асинхронных операций.

Для сеансов FTP InternetConnect пытается установить подключение к серверу в Интернете. Для сеансов HTTP InternetConnect не устанавливает подключение, пока другая функция не попытается получить сведения с сервера.

Примечание

WinINet не поддерживает реализации сервера. Кроме того, его не следует использовать из службы. Для серверных реализаций или служб используйте службы Microsoft Windows HTTP (WinHTTP).