Определение достижимости и быть соединенным

В этой главе описываются достижимость Конфигурации системы и соединение APIs. Вы используете достижимость API, чтобы определить, могут ли данные, предназначенные для удаленного узла, оставить локальную машину. Чтобы запустить или остановить соединение PPP, Вы используете соединение API.

Не необходимо иметь всестороннее понимание архитектуры Конфигурации системы, чтобы определить достижимость или запустить соединение PPP. Достижимость и соединение, APIs обеспечивает уровень абстракции, позволяющей приложению делать соединения, не волнуясь о состоянии сетевого стека.

Объем достижимости и соединения APIs

Много типов приложений должны узнать, достижим ли удаленный узел или запустить основанное на PPP соединение. Например, приложение, возможно, должно было бы проверить на обновления программного обеспечения, которые доступны от удаленного сервера. В версии 10.3 OS X и позже, платформа Конфигурации системы обеспечивает APIs для выполнения этих задач быстро и легко, не требуя детального знания архитектуры Конфигурации системы. В частности достижимость и соединение, APIs выполняет большую часть их работы негласно, таким образом, приложение не должно опрашивать относительно изменений состояния или наблюдать определенные ключи в динамической памяти.

API достижимости Конфигурации системы помогает приложению определить, достижим ли удаленный узел. Удаленный узел считают достижимым, если пакет данных, отправленный в узел, может оставить локальный компьютер, независимо от того, что в конечном счете происходит с пакетом. Другими словами, достижимость удаленного узла не гарантирует, что узел получит данные.

На практике, когда удаленный узел считают достижимым, но пакеты, которые Вы отправляете в него, не приходят, бесчисленные возможные причины отказа попадают в две широких категории:

  1. Повреждается часть Интернет-соединения, над которым Вы не имеете никакого контроля. Например, сервер удаленного узла снижается.

  2. Повреждается часть Вашей инфраструктуры локальной сети, над которой Вы могли бы иметь контроль. Например, Ваш модем не набрал, или Ваша базовая станция AirPort выключена.

Достижимость API не может помочь Вам с проблемами в первой категории. Пока пакеты данных могут оставить локальную машину, удаленный узел считают достижимым. Что достижимость, которую может обеспечить API, является справкой, диагностируя некоторые проблемы во второй категории. Если, например, модем в настоящее время разъединяется, API может сказать Вам это.

Для дальнейшего определения объема достижимости Конфигурации системы и соединения APIs этот документ использует следующие фразы для различения два различных типов сетевого соединения:

API достижимости помогает Вам определить, достижим ли удаленный узел путем исследования состояния канального соединения локальной сети. Соединение API позволяет Вам запускать соединение сетевого канала. После успешного запуска соединения сетевого канала Вы используете различный API (такой как Базовая Основа сетевой API) для установления сетевого транспортного соединения.

Пример достижимости и соединения

Определение достижимости и запрос соединения сетевого канала часто идут рука об руку. Как пример, рассмотрите выполнение почтовой программы. Последовательность событий могла бы пойти как это:

  1. Пользователь запускает почтовую программу для проверки ее электронной почты.

  2. Почтовая программа использует достижимость API, чтобы узнать, достижим ли сервер POP.

  3. API достижимости говорит приложению, что сервер POP достижим, но что должно сначала быть сделано соединение сетевого канала.

  4. Почтовая программа спрашивает пользователя, если она хочет набрать модем, и она нажимает «OK». (Приложение могло бы пропустить этот шаг, если пользователь установил предпочтение, говорящее модему набирать автоматически, когда запускается почтовая программа.)

  5. Почтовая программа использует соединение API для запуска соединения PPP, заставляющего модем набирать. В этой точке почтовая программа может возвратиться к ее работе.

  6. Достижимость 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.

Таблица 4-1  SCNetworkConnectionFlags

Имя флага

Значение

kSCNetworkFlagsTransientConnection

Цель достижима через переходное соединение (например, PPP).

kSCNetworkFlagsReachable

Цель является достижимым использованием текущей конфигурации сети.

kSCNetworkFlagsConnectionRequired

Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Например, подходящее коммутируемое соединение существует, но это не активно.

kSCNetworkFlagsConnectionAutomatic

Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Далее, любой трафик, направленный к цели, будет автоматически инициировать соединение.

kSCNetworkFlagsInterventionRequired

Цель является достижимым использованием текущей конфигурации сети, но соединение должно быть установлено сначала. Далее, некоторое пользовательское действие требуется, чтобы устанавливать соединение (например, обеспечивая пароль).

kSCNetworkFlagsIsLocalAddress

Цель связана с сетевым интерфейсом на существующей системе. Например, целевой адрес является одним из IP-адресов, присвоенных системе.

kSCNetworkFlagsIsDirect

Сетевой трафик к цели не пройдет через маршрутизатор, потому что адрес назначения находится в сети, это непосредственно подключено к одному из интерфейсов локальной машины (например, это находится на той же подсети как локальная машина).

Используя сетевое соединение API

В версии 10.3 OS X платформа Конфигурации системы представила SCNetworkConnection API. Этот API позволяет приложению управлять службами с установлением соединения, уже определенными в системе. В настоящее время приложение может управлять только службами PPP с этим API.

В дополнение к управлению существующей службой приложение может использовать SCNetworkConnection API для получения информации о соединении. API предоставляет информацию состояния соединения на двух уровнях:

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

Табличные 4-2  Высокоуровневые значения состояния соединения

Состояние

Значение

kSCNetworkConnectionInvalid

Сетевое соединение относится к недопустимой службе.

kSCNetworkConnectionDisconnected

Сетевое соединение разъединяется.

kSCNetworkConnectionConnecting

Сетевое соединение соединяется.

kSCNetworkConnectionConnected

Сетевое соединение соединяется.

kSCNetworkConnectionDisconnecting

Сетевое соединение разъединяется.

Если Ваше приложение должно знать больше о соединении PPP, такой как тогда, когда контроллер PPP аутентифицирует к серверу, необходимо использовать SCNetworkConnectionCopyExtendedStatus функция. Вы передаете SCNetworkConnectionRef при представлении соединения с функцией и Вы получаете словарь, содержащий подсловари для каждого субкомпонента службы, такие как PPP, IPv4 и Модем. Состояние соединения PPP представлено константой, определенной в SCNetworkConnection API. Таблица 4-3 показывает текущий набор констант. Обратите внимание на то, что дополнительные значения состояния могли бы быть определены в будущем, таким образом, Ваше приложение должно быть в состоянии обработать неизвестное значение.

Табличные 4-3  значения состояния соединения PPP

Состояние

Значение

kSCNetworkConnectionPPPDisconnected

PPP разъединяется.

kSCNetworkConnectionPPPInitializing

PPP инициализирует.

kSCNetworkConnectionPPPConnectingLink

PPP соединяет нижний уровень (как тогда, когда, например, модем набирает).

kSCNetworkConnectionPPPDialOnTraffic

PPP ожидает сетевого трафика для автоматического установления соединения.

kSCNetworkConnectionPPPNegotiatingLink

Нижний уровень PPP соединяется, и PPP согласовывает канальный уровень (протокол LCP).

kSCNetworkConnectionPPPAuthenticating

PPP аутентифицирует к серверу (использующий PAP, CHAP, MSCHAP или протокол EAP).

kSCNetworkConnectionPPPWaitingForCallBack

PPP ожидает сервера для призывания обратно.Примечание: это состояние определяется, но не произойдет, потому что CallBack не поддерживается в версии 10.3 OS X.

kSCNetworkConnectionPPPNetgotiatingNetwork

PPP аутентифицируется и теперь согласовывает сетевой уровень (использующий IPCP или протокол IPv6CP).

kSCNetworkConnectionPPPConnected

PPP полностью соединяется по крайней мере для одного сетевого уровня. Дополнительные сетевые протоколы могли бы все еще согласовывать.

kSCNetworkConnectionPPPTerminating

Сетевые протоколы PPP и протоколы канального уровня завершаются.

kSCNetworkConnectionPPPDisconnectingLink

PPP разъединяет более низкий уровень соединений (как тогда, когда, например, модем вешает трубку).

kSCNetworkConnectionPPPHoldingLinkOff

PPP разъединяется и поддержание ссылки временно «прочь».

kSCNetworkConnectionPPPSuspended

PPP приостановлен как результат «приостановить» команды как тогда, когда, например, Модем V92 «В ожидании».

kSCNetworkConnectionPPPWaitingForRedial

PPP нашел занятый сервер и ожидает повторного набора.

Для получения дополнительной информации о том, почему Вы могли бы принять решение использовать SCNetworkConnectionCopyExtendedStatus функционируйте, посмотрите Получающую Подробную информацию Состояния соединения PPP.