Понятия CFNetwork

CFNetwork является низким уровнем, высокоэффективная платформа, предоставляющая Вам возможность детализировать управление стеком протоколов. Это - расширение сокетов BSD, стандартная абстракция сокета API, обеспечивающий объекты упростить задачи, такие как связь с FTP и серверами HTTP или разрешением хостов DNS. CFNetwork базируется, и физически и теоретически, на сокетах BSD.

Так же, как CFNetwork полагается на сокеты BSD, существует много классов Какао, полагающихся на CFNetwork (NSURL, например). Кроме того, веб-Набор является рядом классов Какао для отображения веб-контента в окнах. Оба из этих классов являются очень высоким уровнем и реализуют большинство подробных данных сетевых протоколов собой. Таким образом структура программных слоев похожа на изображение на рисунке 1-1.

Рисунок 1-1  CFNetwork и другие программные слои на OS X
CFNetwork and other software layers on OS X

Когда использовать CFNetwork

CFNetwork имеет много преимуществ перед сокетами BSD. Это обеспечивает интеграцию цикла выполнения, поэтому если Ваше приложение является выполненным циклом, базируемым, можно использовать сетевые протоколы, не реализовывая потоки. CFNetwork также содержит много объектов помочь Вам использовать сетевые протоколы, не имея необходимость реализовывать подробные данные самим. Например, можно использовать протоколы FTP, не имея необходимость реализовывать все подробные данные с API CFFTP. Если Вы понимаете сетевые протоколы и нуждаетесь в низкоуровневом управлении, они обеспечивают, но не хотят реализовывать их сами, то CFNetwork является, вероятно, правильным выбором.

Существует много преимуществ использования CFNetwork вместо Уровня основы, объединяющего APIS В СЕТЬ. CFNetwork фокусируется больше на сетевых протоколах, тогда как Уровень основы APIs фокусируется больше на доступе к данным, таком как передача данных по HTTP или FTP. Несмотря на то, что Основа, APIs действительно обеспечивает некоторую конфигурируемость, CFNetwork, обеспечивает намного больше. Для получения дополнительной информации об Основе сетевые классы считайте Руководство по программированию Загрузочной системы URL.

Теперь, когда Вы понимаете, как CFNetwork взаимодействует с другим OS X, объединяющим APIS В СЕТЬ, Вы готовы познакомиться с APIs CFNetwork вместе с двумя APIs, формирующим инфраструктуру для CFNetwork.

Инфраструктура CFNetwork

Прежде, чем узнать о APIs CFNetwork, необходимо сначала понять APIs, который является основой для большинства CFNetwork. CFNetwork полагается на два APIs, который является частью Базовой платформы Основы, CFSocket и CFStream. Понимание этого APIs важно для использования CFNetwork.

CFSocket API

Сокеты являются наиболее базовым уровнем сетевой связи. Сокет действует подобным образом к телефонному разъему. Это позволяет Вам соединяться с другим сокетом (или локально или по сети) и отправлять данные в тот сокет.

Наиболее распространенная абстракция сокета является сокетами BSD. CFSocket является абстракцией для сокетов BSD. С очень мало служебным, CFSocket обеспечивает почти всю функциональность сокетов BSD, и это интегрирует сокет в цикл выполнения. CFSocket не ограничивается сокетами на основе потоков (например, TCP), он может обработать любой тип сокета.

Вы могли создать объект CFSocket с нуля с помощью CFSocketCreate функция, или от сокета BSD с помощью CFSocketCreateWithNative функция. Затем Вы могли создать источник цикла выполнения с помощью функции CFSocketCreateRunLoopSource и добавьте его к циклу выполнения с функцией CFRunLoopAddSource. Это позволило бы Вашей функции обратного вызова CFSocket быть выполненной каждый раз, когда объект CFSocket получает сообщение.

Рид Кфсокет Референс для получения дополнительной информации о КФСОКЕТЕ API.

CFStream API

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

Поток является последовательностью байтов, переданных последовательно по каналу связи. Потоки являются односторонними путями, так чтобы передать двунаправлено ввод (чтение) поток и вывести (пишет), что поток необходим. За исключением основанных на файле потоков, Вы не можете искать в потоке; как только потоковые данные были предоставлены или использованы, они не могут быть получены снова от потока.

CFStream является API, обеспечивающий абстракцию для этих потоков с двумя новыми объектами CFType: CFReadStream и CFWriteStream. Оба типа потока следуют за всей обычной Базовой Основой соглашения API. Для получения дополнительной информации о Базовых типах Основы, считайте Базовые Концепции проекта Основы.

CFStream создается поверх CFSocket и является основой для CFHTTP и CFFTP. Как Вы видите на рисунке 1-2, даже при том, что CFStream не является официально частью CFNetwork, это - основание для почти всех CFNetwork.

Рисунок 1-2  CFStream структура API
CFStream API structure

Можно использовать чтение и записать потоки почти таким же способом, поскольку Вы делаете дескрипторы файлов UNIX. Во-первых, Вы инстанцируете потока путем указания потокового типа (память, файл или сокет) и устанавливаете любые опции. Затем, Вы открываете поток и читаете или пишете любое число раз. В то время как поток существует, можно получить информацию о потоке путем выяснения его свойства. Потоковое свойство является любой информацией о потоке, таком как его источник или место назначения, которое не является частью фактических данных, считанных или записанных. Когда Вы больше не нуждаетесь в потоке, закрываетесь и избавляетесь от него.

Функции CFStream, читающие или пишущие поток, приостановят, или блок, текущий процесс, пока по крайней мере один байт данных не сможет быть считан или записан. Чтобы избежать пытаться читать из или записать в поток, когда поток блокировал бы, используйте асинхронную версию функций и запланируйте поток на цикл выполнения. Вашу функцию обратного вызова вызывают, когда возможно читать и записать без блокирования.

Кроме того, CFStream имеет встроенную поддержку протокола Уровня защищенных сокетов (SSL). Можно установить словарь, содержащий информацию о SSL потока, такую как уровень безопасности желаемые или самоподписанные сертификаты. Тогда передайте его своему потоку как kCFStreamPropertySSLSettings свойство для создания потока потоком SSL.

Глава, Работающая с Потоками, описывает, как использовать потоки записи и чтение.

CFNetwork понятия API

Для понимания платформы CFNetwork необходимо быть знакомы со стандартными блоками, составляющими ее. Платформа CFNetwork разбита в отдельный APIs, каждый покрывающий определенный сетевой протокол. Этот APIs может использоваться в комбинации, или отдельно, в зависимости от Вашего приложения. Большинство соглашений программирования распространено среди APIs, таким образом, важно постигать каждого из них.

API CFFTP

Связь с Ftp-сервером сделана проще с CFFTP. Используя API CFFTP, можно создать потоки чтения FTP (для загрузки) и потоки записи FTP (для загрузки). Используя чтение FTP и потоки записи можно выполнить функции, такие как:

  • Загрузите файл с Ftp-сервера

  • Загрузите файл на Ftp-сервер

  • Загрузите перечисление каталога с Ftp-сервера

  • Создайте каталоги на Ftp-сервере

Поток FTP работает как все другие потоки CFNetwork. Например, можно создать поток чтения FTP путем вызывания функции CFReadStreamCreateWithFTPURL функция. Затем можно вызвать функцию CFReadStreamGetError в любое время проверять состояние потока.

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

Поток CFFTP может использоваться синхронно или асинхронно. Для открытия соединения с Ftp-сервером, указанным, когда поток чтения FTP создавался вызовите функцию CFReadStreamOpen. Для чтения из потока используйте CFReadStreamRead функционируйте и обеспечьте потоковую ссылку чтения, CFReadStreamRef, когда поток чтения FTP создавался, это было возвращено. CFReadStreamRead функционируйте заполняет буфер выводом от Ftp-сервера.

Для получения дополнительной информации об использовании CFFTP посмотрите Работу с Ftp-серверами.

API CFHTTP

Чтобы отправить и получить сообщения HTTP, используйте API CFHTTP. Так же, как CFFTP является абстракцией для протоколов FTP, CFHTTP является абстракцией для протоколов HTTP.

Протокол передачи гипертекста (HTTP) является протоколом запроса/ответа между клиентом и сервером. Клиент создает сообщение запроса. Это сообщение тогда сериализируется, процесс, преобразовывающий сообщение в необработанный поток байтов. Сообщения не могут быть переданы, пока они не сериализируются сначала. Тогда сообщение запроса отправляется в сервер. Запрос обычно просит файл, такой как веб-страница. Сервер отвечает, передавая обратно строку, сопровождаемую сообщением. Этот процесс повторяется так много раз, как необходимо.

Для создания сообщения Запроса HTTP Вы указываете следующее:

  • Метод запроса, который может быть одним из методов запроса, определенных Протоколом передачи гипертекста, такой как OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, и CONNECT

  • URL, такой как http://www.apple.com

  • Версия HTTP, такая как версия 1.0 или 1.1

  • Заголовки сообщения, путем указания имени заголовка, такой как User-Agent, и его значение, такой как MyUserAgent

  • Организация сообщения

После того, как сообщение было создано, Вы сериализируете его. Следующая сериализация, запрос мог бы быть похожим на это:

    GET / HTTP/1.0\r\nUser-Agent: UserAgent\r\nContent-Length: 0\r\n\r\n

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

Больше примеров использования CFHTTP доступно в Связи с Серверами HTTP.

CFHTTPAuthentication API

При отправке Запроса HTTP в сервер аутентификации без учетных данных (или с неправильными учетными данными), сервер возвращает проблему авторизации (более обычно известный как 401 или 407 ответов). API CFHTTPAuthentication применяет учетные данные аутентификации к оспариваемым сообщениям HTTP. CFHTTPAuthentication поддерживает следующие схемы аутентификации:

  • Основной

  • Обзор

  • Диспетчер локальной сети NT (NTLM)

  • Простой и защищенный механизм согласования GSS-API (SPNEGO)

Новый в OS X v10.4 является возможностью перенести постоянство через запросы. В OS X v10.3 каждый раз, когда запросу бросили вызов, необходимо было запустить диалог аутентификации с нуля. Теперь, Вы поддерживаете ряд объектов CFHTTPAuthentication для каждого сервера. При получении 401 или 407 ответов Вы находите правильный объект и учетные данные для того сервера и применяете их. CFNetwork использует информацию, хранившую в том объекте обработать запрос максимально эффективно.

Путем переноса постоянства через запрос эта новая версия CFHTTPAuthentication обеспечивает намного лучшую производительность. Больше информации о том, как использовать CFHTTPAuthentication, доступно в Связи с Аутентификацией Серверов HTTP.

CFHost API

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

CFHost используется точно так же, как CFStream:

  • Создайте объект CFHost.

  • Начните разрешать объект CFHost.

  • Получите или адреса, имена хоста или информацию о достижимости.

  • Уничтожьте объект CFHost, когда Вы будете сделаны с ним.

Как все CFNetwork, CFHost является IPv4 и совместимым IPv6. Используя CFHost, Вы могли записать код, обрабатывающий IPv4 и IPv6 полностью прозрачно.

CFHost интегрируется близко с остальной частью CFNetwork. Например, существует вызванная функция CFStream CFStreamCreatePairWithSocketToCFHost это создаст объект CFStream непосредственно из объекта CFHost. Для получения дополнительной информации о функциях объекта CFHost, см. Ссылку CFHost.

CFNetServices API

Если Вы хотите, чтобы Ваше приложение использовало Добрый день, чтобы зарегистрировать службу или обнаружить службы, используйте CFNetServices API. Добрый день реализация Apple нулевой конфигурации, объединяющей в сеть (ZEROCONF), позволяющий Вам публиковать, обнаруживать и разрешать сетевые службы.

Реализовать Добрый день CFNetServices API определяет три типов объектов: CFNetService, CFNetServiceBrowser и CFNetServiceMonitor. Объект CFNetService представляет службу единой сети, такую как принтер или файловый сервер. Это содержит всю информацию, необходимую для другого компьютера, чтобы разрешить, что сервер, такой как имя, вводит, доменный и номер порта. CFNetServiceBrowser является объектом, используемым для обнаружения доменов и сетевых служб в доменах. И объект CFNetServiceMonitor используется для контроля объекта CFNetService для изменений, таких как сообщение о состоянии в iChat.

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

CFNetDiagnostics API

Приложения, соединяющиеся с сетями, зависят от стабильного соединения. Если сеть теряет работоспособность, это вызывает проблемы с приложением. Путем принятия CFNetDiagnostics API пользователь может самодиагностировать сетевые проблемы, такие как:

  • Отказы физического соединения (например, кабель отключается),

  • Отказы сети (например, DNS или сервер DHCP больше не отвечает),

  • Отказы конфигурации (например, конфигурация прокси является неправильной),

Как только отказ сети был диагностирован, CFNetDiagnostics направляет пользователя для решения проблемы. Если Safari не удалось соединиться с веб-сайтом, Вы, возможно, видели CFNetDiagnostics в действии. Ассистент CFNetDiagnostics может быть замечен на рисунке 1-3.

  Ассистент Диагностики сети рисунка 1-3
CFNetDiagnostics AssistantCFNetDiagnostics Assistant

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

Видеть, как интегрировать CFNetDiagnotics в Ваше чтение приложения Используя Диагностику сети. CFNetDiagnostics является новый API в OS X v10.4.