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


Включение функций Интернета

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

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

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

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

Использование InternetOpen

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

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

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

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

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

  • Используйте INTERNET_OPEN_TYPE_DIRECT, если система, в которой работает приложение, использует прямое подключение к Интернету. Параметры lpszProxyName и lpszProxyBypassInternetOpen не используются и должны иметь значение 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, только если установлен Internet Explorer. Установка Internet Explorer включает файл Wsock32n.dll, который необходим для поддержки прокси-серверов SOCKS. Wsock32n.dll не подлежит распространению.

Перечисление прокси-серверов

WinINet распознает два типа прокси-серверов: прокси типа CERN (только HTTP) и прокси-серверы FTP TIS (только FTP). Если Internet Explorer установлен, WinINet также поддерживает прокси-серверы типа SOCKS. InternetConnect предполагает, что указанный прокси-сервер является прокси-сервером CERN. Если для типа доступа задано значение INTERNET_OPEN_TYPE_DIRECT или INTERNET_OPEN_TYPE_PRECONFIG, параметр lpszProxyNameInternetOpen должен иметь значение 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-операций, а все остальные протоколы будут использовать other.

По умолчанию функция предполагает, что прокси-сервер, указанный lpszProxyName является прокси-сервером CERN. Приложение может указать несколько прокси-серверов, включая различные прокси-серверы для различных протоколов. Например, если указать ""ftp=ftp://ftp-gw HTTP=https://jericho:99 прокси", 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 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 использует корневой HINTERNET дескриптор, созданный InternetOpen для создания дескриптора сеанса. Если флаг INTERNET_FLAG_ASYNC был задан в вызове InternetOpen, вызов InternetConnect должен содержать ненулевое значение контекста.

Имя сервера может содержать имя узла (например, "www.servername.com") или IP-номер сайта в формате ASCII dotted-decimal (например, "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 и более ранние версии.
ИНТЕРНЕТ_ПО_УМОЛЧАНИЮ_HTTP_ПОРТ (INTERNET_DEFAULT_HTTP_PORT) Используйте порт по умолчанию для http-серверов (порт 80).
INTERNET_DEFAULT_HTTPS_PORT Используйте порт по умолчанию для https-серверов (порт 443).
INTERNET_DEFAULT_SOCKS_PORT Используйте порт по умолчанию для серверов брандмауэра SOCKS (порт 1080).

Определение имени пользователя и пароля

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

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

lpszUsername lpszPassword Имя пользователя, отправленное на FTP-сервер Пароль, отправленный на FTP-сервер
NULL NULL "анонимный" Имя электронной почты пользователя
Не 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 Services (WinHTTP).