`

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);
 
   
 
 
 
 
 
 
 
   
    
  
     

 

 

 

   

分享到:
评论

相关推荐

    CFNetwork 编程指南.pdf

    ### CFNetwork 编程指南知识点概览 #### 1. CFNetwork框架简介 - **定义与定位**:CFNetwork框架是苹果操作系统中的一个核心服务框架,主要为开发者提供了一个高度抽象化的网络协议库。该框架简化了多种网络任务的...

    iphone开发 网络资料 CFNetwork

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

    CFNetwork编程指南

    CFNetwork是苹果公司提供的一套网络编程接口,它为iOS和Mac OS X开发者提供了一种方便、高效的方式来处理网络通信。CFNetwork的API基于BSD套接字(sockets)建立,它提供了一个抽象层,从而简化了网络编程过程,并...

    CFNetwork PG

    CFNetwork PG CFNetwork PG

    iOS CFNetwork编程指南

    ### iOS CFNetwork编程指南知识点详解 #### CFNetwork框架概述 CFNetwork是苹果公司开发的一个核心服务框架,它为iOS开发者提供了一系列用于网络任务的API,使得处理网络通信变得更加容易和高效。CFNetwork框架...

    CFNetwork.pdf.zip

    《CFNetwork.pdf》是针对iPhone网络开发的一本深入解析指南,它主要涵盖了Apple的CFNetwork框架,这是一个强大的网络编程接口,用于iOS和macOS应用程序。本文将详细阐述CFNetwork的关键概念、架构、功能以及如何在...

    CFNetwork_Framework

    CFNetwork_Framework Reference is written in English.

    ios cfnetwork 发送http请求简单实例

    CFNetwork 框架的核心组件是 CFStream,它是一个抽象的流式数据处理器,负责处理网络数据的读取和写入。 发送 HTTP 请求 要发送 HTTP 请求,需要创建一个 CFReadStreamRef 对象,该对象负责读取网络数据。然后,...

    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平台的应用...

    OSX服务端+iphone客户端 网络通信小程序

    在本文中,我们将深入探讨如何在OSX服务端与iPhone客户端之间实现网络通信,主要关注CFNETWORK和NSStream这两个关键的iOS及Mac OS X网络编程框架。这些技术使得应用程序能够处理HTTP、FTP、TCP/IP和其他网络协议,...

    OS X网络程序简单例子

    在OS X系统中进行网络编程,开发者通常会利用苹果提供的Core Foundation框架中的CFNetwork和Foundation框架中的NSStream类。这两个工具提供了丰富的功能,用于构建基于TCP/IP协议的网络应用程序,适用于服务端和...

    基于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关联,因此我们...

    IOS应用源码之CFNetworkTest.rar

    本篇文章将围绕"CFNetworkTest"这一源码,深入探讨CFNetwork在实际应用中的运用与实现。 一、CFNetwork框架简介 CFNetwork是Core Foundation框架的一部分,它是Objective-C的C语言接口,同时也支持Swift。...

    iOS底层网络实现

    本文将深入探讨iOS网络底层的实现,主要涉及BSD Socket、CFNetwork和NSStream这三个关键组件。理解并掌握这些技术,对于优化网络性能、处理复杂网络场景以及编写高效、可靠的网络代码至关重要。 首先,我们来看**...

    asihttpRequest

    ASIHTTPRequest 是一个针对 iOS 和 Mac OS X 平台的网络框架,它基于 CFNetwork 框架构建,为开发者提供了一种简单、高效的方式来处理 HTTP 请求。这个框架由 Aleksey Simoniuk 创建,虽然目前已被更现代的解决方案...

    IOS检查网络类型

    首先,我们需要了解iOS提供的一些核心网络框架,如SystemConfiguration、CFNetwork和Reachability。这些框架提供了丰富的API来获取网络状态信息。 1. **SystemConfiguration框架**:此框架主要用于监控系统配置变化...

    user-agent(未解析)

    #### waimai/185CFNetwork/711.2.23Darwin/14.0.0 - **waimai/185**:可能是特定应用程序的标识。 - **CFNetwork/711.2.23**:指示使用的网络库版本。 - **Darwin/14.0.0**:表明操作系统为Mac OS X Yosemite版本。...

Global site tag (gtag.js) - Google Analytics