Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431267
  • 博文数量: 83
  • 博客积分: 2622
  • 博客等级: 少校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 08:59
个人简介

一直在努力

文章分类

全部博文(83)

文章存档

2014年(3)

2013年(9)

2012年(46)

2010年(25)

分类: BSD

2010-09-08 15:04:36

CFNetwork是一种低层的高性能架构,它是基于BSD sockets的基础上做了拓展,提供标准化抽象的API简化FTP HTTP服务器交互任务以及解决DNS主机解析。CFNetwork不管是从理论上还是实际上都是基于BSD sockets的。

很多Cocoa类均是基于CFNetwork(例如,NSURL)。Web Kit是用于在窗口显示web内容的一系列Cocoa类。NSURL是使用标准Internet协议与服务器交互的cocoa类。这些类在CFNetwork基础上进行高层封装,自行实现网络交互协议。

Figure 1-1  CFNetwork and other software layers on Mac OS X

CFNetwork and other software layers . Mac OS X

 

When to use CFNetwork

-----------------------------------------------------------------------------------------------------------------------------------

 

CFNetwork已超过BSD的套接字优势。它提供了run-loop integration,因此,如果您的应用程序是基于run-loop integration的,那么您就可以不必实现线程来进行网络协议通讯。 CFNetwork还包含对象的数量,以帮助您使用而不必实现自己的网络协议的细节。例如,您可以使用FTP,而不必执行与CFFTP API的所有实现细节协议。如果您了解网络协议,需要在低级别的控制他们提供,但不希望实现他们自己,那么CFNetwork可能是正确的选择。
CFNetwork关注与网络协议,而NSURL更加关注与数据访问例如从HTTP或者FTP上传出数据。NSURL不能够提供足够的配置网络协议或者环境的功能,但是CFNetwork可以,NSURL要求您使用Objective-c编程,CFNetWork则更加灵活没有限制,更多的信息,参见 For more information on the Foundation networking frameworks, read URL Loading System Programming Guide

CFNetwork架构
-----------------------------------------------------------------------------------------------------------------------------------

在进行CFNetwork学习之前您必须熟悉CFNetwork的基础API,而这些API都是基于Core Foundation Framework 的 CFSocket 和CFStream。

CFSocket API
---------------------------------------------------------------------------------------

Sockets 是网络通讯的最基本一层。一个 socket 起的作用类似与一个电话线接口,它可以使你连接到另一个 socket 上(不论是本地的还是网络另一端的),并且向那个 socket 发送数据。

最常见的 socket 抽象概念就是 BSD sockets,而 CFSocket 则是 BSD sockets 的抽象。CFSocket 中包含了少数开销,它几乎可以提供 BSD sockets 所具有的一切功能,并且把 socket 集成进一个“运行循环”当中。CFSocket 并不仅仅限于基于流的 sockets (比如 TCP),它可以处理任何类型的 socket。

你可以利用 CFSocketCreate 功能从头开始创建一个 CFSocket 对象,或者利用 CFSocketCreateWithNative 函数从 BSD socket 创建。然后,需要利用函数 CFSocketCreateRunLoopSource 创建一个“运行循环”源,并利用函数 CFRunLoopAddSource 把它加入一个“运行循环”。这样不论 CFSocket 对象是否接收到信息, CFSocket 回调函数都可以运行。

请阅读 CFSocket 参考 中有关 CFSocket API 的更多内容。

CFStream API
---------------------------------------------------------------------------------------

对流的读写操作使我们可以以一种设备无关的方式在各种媒体之间交换数据。你可以为内存、文件或者网络(通过sockets)里面的数据创建流。另外在操作流的时候,所有数据可以分次加载。

数据流本质上是在通信通道中串行传输的一个字节序列,它是单向的,所以如果需要双向传输的话必须操作一个输入流(读操作)和一个输出流(写操作)。除了基于文件的流以外,其他流都是不可搜索的,也就是说:在流数据被提供或者接收之后,就不能再从这个流当中获取数据了。

CFStream API 用两个新的 CFType 对象提供了对这些流的一个抽象:CFReadStream 和 CFWriteStream。两个类型的流都遵循常见的核心基础 API 惯例。有关核心基础类型的更多信息,请参考设计概念 Core Foundation Design Concepts

CFStream 的构建基于 CFSocket,同时也是 CFHTTP 和 CFFTP 的基础。在图 1-2 中你可以看到,尽管 CFStream 并不是 CFNetwork的正式成员,它却是几乎所有 CFNetwork 成员的基础。

igure 1-2  CFStream API structure

CFStream API structure

你几乎可以用操作 UNIX 文件描述符的方式对流进行读写操作。首先,实例化流对象的时候需要指定流的类型(内存、文件或者socket)并且设置任何一个可选项。然后,打开流并可以进行任意次的读写操作。当流还存在的时候,你可以通过流的属性获取有关它的信息。流属性包括有关流的任何信息,比如它的数据源或者目标,这些都不属于被读写的实际数据范畴之内。当你不再需要一个流的时候,需要关闭并把它丢弃。

CFStream 的函数如果不能进行至少一个字节数据的读写操作的话,它们可能会暂停或者阻塞当前的进程。为了避免在阻塞的时候从一个流读数据或者向一个流写数据,可以使用这些函数的异步操作版本,并且把有关这个流的操作放入一个循环当中。当可以从流中读写数据的时候,你的回调函数就会被调用。

另外,CFStream 还内置了对安全 Sockets 层 (SSL) 协议的支持。你可以建立一个包含流的 SSL 信息的字典,其中的信息包括需要的安全级别或者自签署的认证。然后把这些信息当作 kCFStreamPropertySSLSettings 属性传递给流,这样一个流就被转换成了一个 SSL 流。

要创建一个客户定制的 CFStream 是不可能的。比如,如果你想要对客户数据库文件当中的对象进行数据流操作,那么仅仅希望通过创建具有自己风格的 CFStream 对象是办不到这一点的,而只有通过定制 NSStream 的子类(利用 Objective-C)才可以做到。由于 NSStream 对象可以很容易的被转换为 CFStream 对象,所以你创建的 NSStream 子类可以被用在任何需要 CFStream 的地方。任何有关 NSStream 所属类的信息,请参考Cocoa 流编程指南

"有关流的操作"一章描述了如何进行读写流操作。

 

CFNetwork  API Concepts

---------------------------------------------------------------------------------------

了解cfnetwork的架构,你首先需要了解组成它的各个部分。THE CFNetwork是有多个相互独立的API组成的,每一个负责一种单独的网络协议。这些API可以单独使用也可以联合使用,这依赖于你的程序。大多数的编程约定属于共同的API,因此重要的是要理解他们。
CFFTP API
CFHTTP API
CFHTTPAuthentication API
CFHost API
CFNetServices API
CFNetDiagnostics API
阅读(5564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~