Включение функциональных возможностей Интернета
Перед использованием функций 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).