`

CFNetWork

    博客分类:
  • ios
 
阅读更多

    CFNetWork

     

      iOS网络编程层次模型分为三层:

  • Cocoa层:NSURL,Bonjour,Game Kit,WebKit
  • Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices
  • OS层:基于 C 的 BSD socket

      CFNetwork是一种低层的高性能架构,它是基于BSD sockets的基础上做了拓展,提供标准化抽象的API简化FTP HTTP服务器交互任务以及解决DNS主机解析。CFNetwork不管是从理论上还是实际上都是基于BSD sockets的。很多Cocoa类均是基于CFNetwork(例如,NSURL)。Web Kit是用于在窗口显示web内容的一系列Cocoa类。NSURL是使用标准Internet协议与服务器交互的cocoa类。这些类在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 回调函数都可以运行。

 

 

    CFStream API

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

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

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

       CFStream API 用两个新的 CFType 对象提供了对这些流的一个抽象:CFReadStream 和 CFWriteStream。两个类型的流都遵循常见的核心基础 API 惯例。

       CFStream 的构建基于 CFSocket,同时也是 CFHTTP 和 CFFTP 的基础。尽管 CFStream 并不是 CFNetwork的正式成员,它却是几乎所有 CFNetwork 成员的基础。

 

    

      CFNetWork基础:

      CFFTP API

      CFHTTP API
      CFHTTPAuthentication API
      CFHost API
      CFNetServices API
      CFNetDiagnostics API
 
 
      CFNetWork  API  Demo示例:
CFNetwork 接口是基于 C 的,下面的接口用于创建一对 socket stream,一个用于读取,一个用于写入:
void CFStreamCreatePairWithSocketToHost(CFAllocatorRef alloc, CFStringRef host, UInt32 port, CFReadStreamRef *readStream, CFWriteStreamRef *writeStream);
     该函数使用 host 以及 port,CFNetwork 会将该 host 转换为 IP 地址,并转换为网络字节顺序。如果我们只需要一个 socket stream,我们可以将另外一个设置为 NULL。还有另外两个“重载”的创建 socket sream的接口:CFStreamCreatePairWithSocket 和 CFStreamCreatePairWithPeerSocketSignature,在这里就不一一介绍了。
 
    在使用这些 socket stream 之前,必须显式地调用其 open 函数:
    
Boolean CFReadStreamOpen(CFReadStreamRef stream);

Boolean CFWriteStreamOpen(CFWriteStreamRef stream);
 
但与 socket 不同的是,这两个接口是异步的,当成功 open 之后,如果调用方设置了获取 kCFStreamEventOpenCompleted 事件的标志的话就会其调用回调函数。

   而该回调函数及其参数设置是通过如下接口进行的:

    

Boolean CFReadStreamSetClient(CFReadStreamRef stream, CFOptionFlags streamEvents, CFReadStreamClientCallBack clientCB, CFStreamClientContext *clientContext);

Boolean CFWriteStreamSetClient(CFWriteStreamRef stream, CFOptionFlags streamEvents, CFWriteStreamClientCallBack clientCB, CFStreamClientContext *clientContext);

 

该函数用于设置回调函数及相关参数。通过 streamEvents 标志来设置我们对哪些事件感兴趣;clientCB 是一个回调函数,当事件标志对应的事件发生时,该回调函数就会被调用;clientContext 是用于传递参数到回调函数中去。   

 

       
      当设置好回调函数之后,我们可以将 socket stream 当做事件源调度到 run-loop 中去,这样 run-loop 就能分发该 socket stream 的网络事件了。
     
void CFReadStreamScheduleWithRunLoop(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);

void CFWriteStreamScheduleWithRunLoop(CFWriteStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
  注意,在我们不再关心该 socket stream 的网络事件时,记得要调用如下接口将 socket stream 从 run-loop 的事件源中移除。
     
void CFReadStreamUnscheduleFromRunLoop(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);

void CFWriteStreamUnscheduleFromRunLoop(CFWriteStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode);
 
    当我们将 socket stream 的网络事件调度到 run-loop 之后,我们就能在回调函数中处理相应各种事件,比如 kCFStreamEventHasBytesAvailable 读取数据:
     
Boolean CFReadStreamHasBytesAvailable(CFReadStreamRef stream);

CFIndex CFReadStreamRead(CFReadStreamRef stream, UInt8 *buffer, CFIndex bufferLength);
   或 kCFStreamEventCanAcceptBytes 写入数据:
   
Boolean CFWriteStreamCanAcceptBytes(CFWriteStreamRef stream);

CFIndex CFWriteStreamWrite(CFWriteStreamRef stream, const UInt8 *buffer, CFIndex bufferLength);
   最后,我们调用 close 方法关闭 socket stream:
   
void CFReadStreamClose(CFReadStreamRef stream);

void CFWriteStreamClose(CFWriteStreamRef stream);
   
   FReadStreamCopyError,该接口用于获取当前的错误信息,如果没有错误则返回 NULL。
   
CFErrorRef CFReadStreamCopyError(CFReadStreamRef stream);

CFErrorRef CFWriteStreamCopyError(CFWriteStreamRef stream);
   我们还可以调用如下接口获取 socket stream 的当前状态:
   
CFStreamStatus CFReadStreamGetStatus(CFReadStreamRef stream);

CFStreamStatus CFWriteStreamGetStatus(CFWriteStreamRef stream);
 
   
 
 
 
 
 
 
 
   
    
  
     

 

 

 

   

分享到:
评论

相关推荐

    iphone开发 网络资料 CFNetwork

    CFNetwork Programming Guide详细介绍了iphone网络开发各个方面。从BSD socket 到 CFFTP CFHTTP等等。

    CFNetwork PG

    CFNetwork PG CFNetwork PG

    CFNetwork_Framework

    CFNetwork_Framework Reference is written in English.

    CFNetwork编程指南

    iOS开发, CFNetwork编程指南,CFNetwork编程指南,CFNetwork编程指南,值得学习 !

    iOS CFNetwork编程指南

    CFNetwork+编程指南 详细讲解了iOS CFNetwork编程对于想深入研究CFNetwork框架的同学非常 值得下载学习

    CFNetwork 编程指南.pdf

    CFNetwork 是核心服务框架中的⼀个框架,它提供了⼀个抽象化的网络协议库。这种抽象使得进行各种网络任务都非常容易,比如: ▪ 使用 BSD sockets ▪ 利用 SSL 或者 TLS 创建加密的连接 ▪ 解析 DNS 主机 ▪ 涉及到 ...

    CFNetwork.pdf.zip

    CFNetwork.pdf有关IPhone网络开发的电子书

    ios cfnetwork 发送http请求简单实例

    关于ios cfnetwork 发送http请求简单实例

    iPhone CFNetwork

    Demo中不仅有连接WebService接口调用,还有WCF服务调用。WCFViewController写了一个例子说明调用过程需传递的参数和返回数据获取。XmlParse文件夹为解析Xml文件,其中两个例子为解析WebService接口返回,一个为WCF...

    CFNetwork_PG

    CFNetwork Programming Guide is written in English.

    ASIHTTPRequest 最新版本 包 下载

    使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用...

    基于CFNetWork的网络请求框架(iOS源代码)

    LHHTTPRequest 是基于CFNetWork的网络请求框架,功能非常强大. LHHTTPRequest 只有两个类: 1.LHHTTPRequest 此类包含了所有的网络请求,一个对象一个请求,GET,POST,下载文件到指定路径,进度追踪,分段下载,断点下载 2....

    harlogger:简单实用,可将越狱的iOS设备上的解密HTTPHTTPS流量嗅探为HAR格式

    要在越狱设备上触发此功能,您只需为com.apple.CFNetwork放置正确的配置并触发com.apple.CFNetwork.har-capture-update通知即可。 由于此捕获触发了syslog行,这些行可以与它们的产生映像名称和pid关联,因此我们...

    NTP_Component.framework for ios

    使用方法:解压后拷贝framework文件夹到工程目录并添加到工程中,再添加CFNetwork.framework即可使用。 在viewcontroller中调用[[NetworkClock sharedNetworkClock] updateDate]; 并实现GetNTPDateDelegate的-(void)...

    IOS语音识别

    2:添加AudioToolbox.framework、CFNetwork.framework、CoreGraphics.framework、QuartzCore.framework、SystemConfiguration.framework。 3:迅飞语音和高德地图中有一个引用重复了,解决办法就是到other linker ...

    iPhone开发进阶.doc

    • CFNetwork(http,https,ftp,SSL,TLS) • 网络安全 • SQLite(SQL数据库) • XML Core OS • 多线程 • 网络应用(BSD套接字) • 文件系统 • Bonjour(利用无线网络连接其他机器)

    Android代码-PayiOS

    CFNetwork.framework CoreMotion.framework AlipaySDK.framework(在下载的SDK中添加) 2.2 配置应用白名单 针对 iOS 9 系统更新, 为了使你接入的微信支付与支付宝支付兼容 iOS 9 ,请按照以下引导进行操作: 应用...

    IOS开发第3方库之ASI下载

    ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。 ...

    iOS技术概述

    CFNetwork 框架 27 Core Data 框架 28 Core Foundation 框架 28 Core Location 框架 29 Core Media 框架 29 Core Telephony 框架 29 Event Kit 框架 30 Foundation 框架 30 Mobile Core Services 框架 30 Quick Look...

Global site tag (gtag.js) - Google Analytics