Определение достижимости и быть соединенным
В этой главе описываются достижимость Конфигурации системы и соединение APIs. Вы используете достижимость API, чтобы определить, могут ли данные, предназначенные для удаленного узла, оставить локальную машину. Чтобы запустить или остановить соединение PPP, Вы используете соединение API.
Не необходимо иметь всестороннее понимание архитектуры Конфигурации системы, чтобы определить достижимость или запустить соединение PPP. Достижимость и соединение, APIs обеспечивает уровень абстракции, позволяющей приложению делать соединения, не волнуясь о состоянии сетевого стека.
Объем достижимости и соединения APIs
Много типов приложений должны узнать, достижим ли удаленный узел или запустить основанное на PPP соединение. Например, приложение, возможно, должно было бы проверить на обновления программного обеспечения, которые доступны от удаленного сервера. В версии 10.3 OS X и позже, платформа Конфигурации системы обеспечивает APIs для выполнения этих задач быстро и легко, не требуя детального знания архитектуры Конфигурации системы. В частности достижимость и соединение, APIs выполняет большую часть их работы негласно, таким образом, приложение не должно опрашивать относительно изменений состояния или наблюдать определенные ключи в динамической памяти.
API достижимости Конфигурации системы помогает приложению определить, достижим ли удаленный узел. Удаленный узел считают достижимым, если пакет данных, отправленный в узел, может оставить локальный компьютер, независимо от того, что в конечном счете происходит с пакетом. Другими словами, достижимость удаленного узла не гарантирует, что узел получит данные.
На практике, когда удаленный узел считают достижимым, но пакеты, которые Вы отправляете в него, не приходят, бесчисленные возможные причины отказа попадают в две широких категории:
Повреждается часть Интернет-соединения, над которым Вы не имеете никакого контроля. Например, сервер удаленного узла снижается.
Повреждается часть Вашей инфраструктуры локальной сети, над которой Вы могли бы иметь контроль. Например, Ваш модем не набрал, или Ваша базовая станция AirPort выключена.
Достижимость API не может помочь Вам с проблемами в первой категории. Пока пакеты данных могут оставить локальную машину, удаленный узел считают достижимым. Что достижимость, которую может обеспечить API, является справкой, диагностируя некоторые проблемы во второй категории. Если, например, модем в настоящее время разъединяется, API может сказать Вам это.
Для дальнейшего определения объема достижимости Конфигурации системы и соединения APIs этот документ использует следующие фразы для различения два различных типов сетевого соединения:
Сетевое транспортное соединение. Это - основанное на TCP соединение, Вы инициируете использование, например, сокеты BSD.
Соединение сетевого канала. Это - основанное на PPP соединение, которое Вы инициируете, например, говоря модему набрать.
API достижимости помогает Вам определить, достижим ли удаленный узел путем исследования состояния канального соединения локальной сети. Соединение API позволяет Вам запускать соединение сетевого канала. После успешного запуска соединения сетевого канала Вы используете различный API (такой как Базовая Основа сетевой API) для установления сетевого транспортного соединения.
Пример достижимости и соединения
Определение достижимости и запрос соединения сетевого канала часто идут рука об руку. Как пример, рассмотрите выполнение почтовой программы. Последовательность событий могла бы пойти как это:
Пользователь запускает почтовую программу для проверки ее электронной почты.
Почтовая программа использует достижимость API, чтобы узнать, достижим ли сервер POP.
API достижимости говорит приложению, что сервер POP достижим, но что должно сначала быть сделано соединение сетевого канала.
Почтовая программа спрашивает пользователя, если она хочет набрать модем, и она нажимает «OK». (Приложение могло бы пропустить этот шаг, если пользователь установил предпочтение, говорящее модему набирать автоматически, когда запускается почтовая программа.)
Почтовая программа использует соединение API для запуска соединения PPP, заставляющего модем набирать. В этой точке почтовая программа может возвратиться к ее работе.
Достижимость API уведомляет почтовую программу, что соединение сетевого канала произошло и почтовая программа тогда, использует сетевое транспортное соединение для выборки электронной почты.
После того, как почтовая программа поставляет электронную почту пользователю, это могло бы или не могло бы заставить соединение PPP отбрасывать, в зависимости от предпочтений пользователя. Так или иначе, когда почтовая программа выходит, соединение PPP отбрасывается и, если почтовая программа содержала последнюю ссылку на соединение, модемные разъединения. Для получения дополнительной информации о ссылках соединения посмотрите Запуск и Остановку Соединения.
Используя достижимость API
В версиях OS X до 10,3, достижимость Конфигурации системы API состоял из двух функций. Функции, SCNetworkCheckReachabilityByAddress
и SCNetworkCheckReachabilityByName
, предоставьте информацию о достижимости удаленного узла путем обеспечения ряда флагов. Флаги (определенный в SCNetwork.h
) укажите, например, что указанный удаленный узел мог быть достигнут с помощью текущей конфигурации сети. К сожалению, эти функции призвали опрашивать, потому что они не поддерживали уведомления.
В версии 10.3 OS X платформа Конфигурации системы представила SCNetworkReachability API, поддерживающий асинхронные уведомления об изменениях в соединении с удаленным узлом. Вы все еще добираетесь, тот же набор состояния соединения отмечает предыдущие функции достижимости, предоставленные, чтобы определить, требуется ли соединение, но Вы больше не должны опрашивать, чтобы узнать, успешна ли попытка подключения.
Большинство функций в новом API полагается SCNetworkReachabilityRef
(определенный в SCNetworkReachability.h
) Вы используете для идентификации удаленной цели. Вы создаете эту ссылку для определенного адреса или имени хоста и используете его, чтобы добавить ссылку на Ваш цикл выполнения и установить функцию обратного вызова. Можно использовать информацию во флагах состояния соединения для запроса соединения сетевого канала и новой достижимости, API уведомляет Вас, когда установлено соединение.
Можно использовать новые функции достижимости в приложении для выполнения следующих задач:
Создайте ссылку для своего целевого удаленного узла, который можно использовать в других функциях достижимости.
Добавьте цель к своему циклу выполнения.
Обеспечьте функцию обратного вызова, это вызывают, когда изменяется состояние достижимости Вашей цели.
Определите, достижима ли цель.
Следующие разделы описывают, как использовать функции SCNetworkReachability для выполнения этих задач. Для примера кода, демонстрирующего, как использовать SCNetworkReachability API, посмотрите SimpleReach.
Создание ссылки
SCNetworkReachability API обеспечивает три функции, создающие целевую ссылку, которую можно использовать для контроля достижимости удаленного узла:
Если Вы интересуетесь достижимостью только удаленного узла, можно использовать также SCNetworkReachabilityCreateWithAddress
или SCNetworkReachabilityCreateWithName
. Для SCNetworkReachabilityCreateWithAddress
, Вы предоставляете удаленный адрес узла в a sockaddr
структура. Для получения дополнительной информации о sockaddr
структура, посмотрите сети man
страница в http://developer .apple.com/documentation/Darwin/Reference/ManPages/man4/netintro.4.html. Для SCNetworkReachabilityCreateWithName
, Вы предоставляете удаленное имя хоста, такое как www.apple.com.
Если необходимо наблюдать возможные изменения и к локальным и к удаленным адресам узла, Вы используете SCNetworkReachabilityCreateWithAddressPair
функция. Эта функция возвращает ссылку, которую можно использовать, чтобы узнать если:
Адрес Ваших локальных изменений узла
Удаленный адрес становится недостижимым
Сетевой маршрут связался с удаленными изменениями узла
Все три функции возвращают объект типа SCNetworkReachabilityRef
для удаленного узла, который можно использовать в любой из других функций SCNetworkReachability.
Добавление Target к циклу выполнения
Гарантировать, что Ваше приложение получает уведомление, когда состояние достижимости целевых удаленных изменений узла, Вы добавляете цель SCNetworkReachabilityRef
к циклу выполнения Вашего приложения. Цикл выполнения контролирует источники ввода к приложению. Когда входной источник становится готовым к обработке (потому что некоторое действие происходит), управление отгрузками цикла выполнения к функции обратного вызова, связанной с входным источником. Для получения дополнительной информации о выполненных циклах и режимах, посмотрите Циклы Выполнения.
Для сетевого осведомленного приложения входной источник SCNetworkReachabilityRef
, действие является изменением в состоянии соединения цели, и функция обратного вызова является той, которую Вы обеспечиваете. Таким образом, при помощи достижимости API, чтобы добавить Вашу цель к циклу выполнения Вашего приложения и обеспечить функцию обратного вызова (описанный в Соединении Функции обратного вызова С Target), Вы гарантируете, что Ваше приложение будет уведомлено относительно изменений в достижимости цели.
Добавить SCNetworkReachabilityRef
к циклу выполнения Вашего приложения Вы используете SCNetworkReachabilityScheduleWithRunLoop
функция. Вы обеспечиваете SCNetworkReachabilityRef
, ссылка на цикл выполнения Вашего приложения и режим, в котором цикл выполнения должен работать, обычно режим по умолчанию.
Удалить SCNetworkReachabilityRef
от цикла выполнения Вашего приложения Вы используете SCNetworkReachabilityUnscheduleFromRunLoop
функция, требующая тех же параметров как SCNetworkReachabilityScheduleWithRunLoop
функция.
Соединение функции обратного вызова с Target
Для использования уведомлений достижимость, API обеспечивает, необходимо связать функцию обратного вызова с SCNetworkReachabilityRef
при представлении удаленного узла Вы интересуетесь. Функция обратного вызова могла бы вывести на экран изменение в соединении с пользователем или выполнить некоторую другую задачу.
Для соединения функции обратного вызова с целью Вы сначала определяете функцию типа SCNetworkReachabilityCallBack
(этот тип определяется в SCNetworkReachability.h
). Для передачи контекстной информации об изменениях в функции обратного вызова Вы определяете структуру типа SCNetworkReachabilityContext
. Вы используете info
параметр для содержания контекстной информации (можно также указать NULL, если контекстная информация является ненужной). Наконец, Вы передаете функцию обратного вызова, SCNetworkReachabilityRef
представление удаленного узла и контекста к SCNetworkReachabilitySetCallback
функция.
Определение достижимости
SCNetworkReachability API обеспечивает SCNetworkReachabilityGetFlags
функция можно использовать для определения достижимости удаленного узла. Эти предоставления функции то же состояние соединения отмечают более старые функции, определяемые достижимости в SCNetwork.h
предоставленный.
Для использования этой функции Вы предоставляете SCNetworkReachabilityRef
для Вашего удаленного узла и адреса переменной Вы объявляете для содержания флагов. Флаги, которые можно получить, перечислены в Таблице 4-1.
Имя флага | Значение |
---|---|
| Цель достижима через переходное соединение (например, PPP). |
| Цель является достижимым использованием текущей конфигурации сети. |
| Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Например, подходящее коммутируемое соединение существует, но это не активно. |
| Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Далее, любой трафик, направленный к цели, будет автоматически инициировать соединение. |
| Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Далее, некоторое пользовательское действие требуется, чтобы устанавливать соединение (например, обеспечивая пароль). |
| Цель связана с сетевым интерфейсом на существующей системе. Например, целевой адрес является одним из IP-адресов, присвоенных системе. |
| Сетевой трафик к цели не пройдет через маршрутизатор, потому что адрес назначения находится в сети, это непосредственно подключено к одному из интерфейсов локальной машины (например, это находится на той же подсети как локальная машина). |
Используя сетевое соединение API
В версии 10.3 OS X платформа Конфигурации системы представила SCNetworkConnection API. Этот API позволяет приложению управлять службами с установлением соединения, уже определенными в системе. В настоящее время приложение может управлять только службами PPP с этим API.
В дополнение к управлению существующей службой приложение может использовать SCNetworkConnection API для получения информации о соединении. API предоставляет информацию состояния соединения на двух уровнях:
Высокий уровень, универсальная информация, описывающая состояние сетевого соединения, такой, как соединено или разъединено
Подробная, специфичная для PPP информация, описывающая состояние штабеля PPP
Эти два уровня информации о статусе предназначаются для различных типов приложений. Сетевое осведомленное приложение могло бы хотеть вывести на экран, живо ли соединение сетевого канала, но вероятно не заинтересовано знанием, если контроллер PPP в настоящее время конфигурирует канальный уровень. Сложное приложение номеронабирателя, с другой стороны, возможно, должно было бы знать точно, что контроллер PPP делает на каждом шаге процесса соединения.
Несмотря на то, что эти функции определяются в том же заголовочном файле, эта глава не описывает специфичные для PPP функции состояния соединения в SCNetworkConnection.h
. Для получения дополнительной информации о том, как использовать эти функции и как использовать схему Конфигурации системы для интерпретации результатов, см. Схему Конфигурации системы. Вместо этого эта глава фокусируется на остатке от SCNetworkConnection API, описывая, как приложение может использовать его для выполнения следующих задач:
Создайте ссылку, представляющую соединение, которое можно использовать с другими функциями соединения.
Добавьте ссылку соединения на цикл выполнения своего приложения.
Запустите соединение.
Получите состояние соединения.
Остановите существующее соединение.
Для примера кода, демонстрирующего использование SCNetworkConnection API, посмотрите SimpleDial.
Создание ссылки соединения
SCNetworkConnection API обеспечивает одну функцию, которую можно использовать для создания ссылки соединения: SCNetworkConnectionCreateWithServiceID
. Для использования этой функции Вы предоставляете службу ID и функцию обратного вызова, вместе с несколькими другими параметрами, и Вы получаете объект типа SCNetworkConnectionRef
. Вы используете этот объект представлять соединение в других функциях SCNetworkConnection.
Поскольку Вы будете использовать SCNetworkConnectionRef
для обращения к определенному соединению PPP необходимо предоставить уникальную службу ID для идентификации его. Существует два способа получить эту службу ID. Один путь состоит в том, чтобы посмотреть в динамической памяти для доступных служб и выбрать ту. Второй путь для Вашего приложения для использования SCNetworkConnectionCopyUserPreferences
функция для получения службы ID по умолчанию (та интернет-использование приложения Подключения).
Несмотря на то, что можно передать NULL для параметра функции обратного вызова, он не рекомендуется. Если Вы не определите функцию обратного вызова, то Ваше приложение не получит уведомления изменения состояния и должно будет опросить относительно обновлений.
Добавление ссылки соединения на цикл выполнения
Гарантировать Ваше приложение уведомляется относительно изменений в состоянии определенного соединения, можно добавить SCNetworkConnectionRef
представление соединения с циклом выполнения приложения. Когда состояние соединения изменяется, SCNetworkConnectionRef
предупреждает цикл выполнения, и цикл выполнения передает управление к функции обратного вызова, которую Вы обеспечиваете.
Добавить SCNetworkConnectionRef
к циклу выполнения Вашего приложения Вы используете SCNetworkConnectionScheduleWithRunLoop
функция. Вы обеспечиваете SCNetworkConnectionRef
, ссылка на цикл выполнения Вашего приложения и режим, в котором цикл выполнения должен работать (в большинстве случаев, режим по умолчанию). Для получения дополнительной информации о выполненных циклах и режимах, посмотрите Введение для Выполнения Циклов в Базовой Ссылочной Библиотеке Основы.
Удалить SCNetworkConnectionRef
от цикла выполнения Вашего приложения Вы используете SCNetworkConnectionUnscheduleFromRunLoop
функция. Как SCNetworkConnectionScheduleWithRunLoop
функция, эта функция ожидает SCNetworkConnectionRef
, ссылка на цикл выполнения Вашего приложения и режим цикла выполнения.
Запуск и остановка соединения
SCNetworkConnection API обеспечивает две функции, которые Ваше приложение может использовать для управления соединением с помощью SCNetworkConnectionRef
объект:
Обе функции возвращаются сразу, в то время как соединение или разъединение обрабатывают, они инициируют доходы асинхронно. Если Вы добавляете соединение SCNetworkConnectionRef
к циклу выполнения Вашего приложения и обеспечивают функцию обратного вызова, Ваше приложение уведомляется, когда изменяется состояние соединения. Ваше приложение может тогда проверить состояние, чтобы определить, завершен ли процесс соединения. Если Вы не добавляете ссылку соединения на цикл выполнения, необходимо будет опросить для обнаружения состояния соединения, и это не рекомендуется.
По умолчанию, SCNetworkConnectionStart
функционируйте использует предпочтительные настройки подключения пользователя для запуска соединения. Можно, однако, обеспечить словарь значений для переопределения некоторых из этих настроек на время соединения.
Если Вы действительно обеспечиваете, словарь дополнительных настроек знают что:
Словарь должен быть в правильном формате для словаря сетевой службы (описан в Словаре NetworkServices). Если Вы не следуете за этим форматом точно, контроллер PPP может проигнорировать словарь.
Контроллер PPP объединяет настройки, которые Вы предоставляете существующие настройки пользователя, прежде чем соединение будет установлено, игнорируя любые несоответствующие значения в Вашем словаре.
Запуск и остановка соединения неявно решены в арбитражном порядке. Это означает, что интерес, который другие приложения могут иметь в соединении, учтен, прежде чем соединение останавливается. Например, приложение «B» может запустить соединение, уже запущенное приложением «A». Приложение можение принимает решение остановить соединение, но система не должна останавливать соединение до «B», закончено с ним. Используя функции SCNetworkConnection, приложение вызов банки SCNetworkConnectionStop
на соединении и функции возвратит успех, но соединение не остановится до «B» вызовы SCNetworkConnectionStop
. Приложение может также использовать linger
параметр (обсужденный ниже) для регистрации интереса.
SCNetworkConnectionStart
функция позволяет приложению указывать интерес к соединению. Таким образом приложение может запросить, чтобы существование соединения было связано к мерам, которые принимает приложение. В самом простом случае приложение могло бы хотеть, чтобы соединение запустилось, когда приложение вызывает SCNetworkConnectionStart
и остановитесь, когда любое из следующих событий будет иметь место:
Выходы приложения.
Приложение выпускает
SCNetworkConnectionRef
представление соединения.Вызовы приложения
SCNetworkConnectionStop
.
Для указания интереса к соединению приложение может использовать linger
параметр SCNetworkConnectionStart
функция. Приложение, такое как почтовый клиент, который должен быть соединен, выполняет свои задачи и разъединяется, устанавливает параметр на FALSE
. Это указывает, что соединение должно остановиться, когда приложение выходит или выпускает ссылку соединения. Приложение номеронабирателя PPP, с другой стороны, могло бы принять решение установить параметр на TRUE
так, чтобы пользователь управлял модемом. TRUE
значение указывает, что соединение не должно останавливаться, когда приложение выходит или выпускает ссылку соединения.
Важно отметить, однако, что несколько параллельных приложений могли бы зарегистрировать интерес к тому же соединению. Когда дело обстоит так, платформа Конфигурации системы отслеживает ссылки на соединение, останавливая его, когда последняя ссылка выпущена (или последнее приложение, содержащее ссылку, выходит).
SCNetworkConnectionStop
функция выполняет решенную в арбитражном порядке остановку соединения. Другими словами, это закрывает соединение если:
Нет никаких других заинтересованных приложений, в настоящее время работающих или содержащих ссылки на соединение. Если существует,
SCNetworkConnectionStop
функционируйте успех возвратов к вызывающему приложению, но соединение сохранится, пока все заинтересованные приложения не завершают или выпускают свои ссылки на соединение.Приложение вызывает
SCNetworkConnectionStop
и передачиTRUE
вforceDisconnect
параметр. Это останавливает соединение независимо от интереса других в настоящее время запущенных приложений. Большинство приложений не должно вынуждать соединение остановиться таким образом. Приложение номеронабирателя PPP, однако, вероятно приняло бы решение сделать это, потому что оно гарантирует, что соединение останавливается, когда пользователь хочет его к.
Получение состояния соединения
Приложение может использовать SCNetworkConnectionGetStatus
функция для получения высокоуровневого состояния соединения. Вы передаете SCNetworkConnectionRef
при представлении соединения с функцией и Вы получаете одну из констант, показанных во Введении в Инструкции по Программированию Конфигурации системы.
Состояние | Значение |
---|---|
Сетевое соединение относится к недопустимой службе. | |
Сетевое соединение разъединяется. | |
Сетевое соединение соединяется. | |
Сетевое соединение соединяется. | |
Сетевое соединение разъединяется. |
Если Ваше приложение должно знать больше о соединении PPP, такой как тогда, когда контроллер PPP аутентифицирует к серверу, необходимо использовать SCNetworkConnectionCopyExtendedStatus
функция. Вы передаете SCNetworkConnectionRef
при представлении соединения с функцией и Вы получаете словарь, содержащий подсловари для каждого субкомпонента службы, такие как PPP, IPv4 и Модем. Состояние соединения PPP представлено константой, определенной в SCNetworkConnection API. Таблица 4-3 показывает текущий набор констант. Обратите внимание на то, что дополнительные значения состояния могли бы быть определены в будущем, таким образом, Ваше приложение должно быть в состоянии обработать неизвестное значение.
Состояние | Значение |
---|---|
PPP разъединяется. | |
PPP инициализирует. | |
PPP соединяет нижний уровень (как тогда, когда, например, модем набирает). | |
PPP ожидает сетевого трафика для автоматического установления соединения. | |
Нижний уровень PPP соединяется, и PPP согласовывает канальный уровень (протокол LCP). | |
PPP аутентифицирует к серверу (использующий PAP, CHAP, MSCHAP или протокол EAP). | |
PPP ожидает сервера для призывания обратно.Примечание: это состояние определяется, но не произойдет, потому что CallBack не поддерживается в версии 10.3 OS X. | |
| PPP аутентифицируется и теперь согласовывает сетевой уровень (использующий IPCP или протокол IPv6CP). |
PPP полностью соединяется по крайней мере для одного сетевого уровня. Дополнительные сетевые протоколы могли бы все еще согласовывать. | |
kSCNetworkConnectionPPPTerminating | Сетевые протоколы PPP и протоколы канального уровня завершаются. |
PPP разъединяет более низкий уровень соединений (как тогда, когда, например, модем вешает трубку). | |
PPP разъединяется и поддержание ссылки временно «прочь». | |
PPP приостановлен как результат «приостановить» команды как тогда, когда, например, Модем V92 «В ожидании». | |
PPP нашел занятый сервер и ожидает повторного набора. |
Для получения дополнительной информации о том, почему Вы могли бы принять решение использовать SCNetworkConnectionCopyExtendedStatus
функционируйте, посмотрите Получающую Подробную информацию Состояния соединения PPP.