ios开发 网络编程浅析(一)
iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能。
(1)BSD套接字。最底层的套接字,这是Unix网络开发常用的API。如果从其他系统移植程序,而程序用的是BSD套接字,那么网络部分可以继续使用这些API。
(2)CFNetwork framework 。CFNetwork 也是比较底层的, 是对BSD套接字的一个扩展 。它是一个C语言的库,它是基于BSD套接字,提供了对网络协议的抽象。这些抽象使得用户更容易地操作套接字、处理网络的各种连接。。它集成了run-loop,因此使用CFNetwork不用自己去实现事件循环。CFNetwork 还包括了一些网络协议(如HTTP、FTP)的实现,可以在不了解这些协议细节的情况下直接使用。
(3) Foundation framework是基于Objectice-C语言的库,它为CFNetwork API 提供了面向对象的抽象。
(4)CFURL(C)/NSURL(Objective-C)是比较高层的API,它们提供了从Web和FTP服务器下载文件或其他资源的一种简单的方法。其中,CFURL是CFNetwork的一部分,NSURL是Foundation的一部分。
(5)CFNetServices/NSNetServices提供了使用Bonjour注册和发现网络服务的方法。
总之,CFNetwork framework 和 Foundation framework是最为强大的两个库,它们是比较底层、高效,提供的接口也非常丰富。
套接字 套接字是网络通信的基本构件,提供了不同主机间进程双向通信的端点。如果电话,只有当一方拨通另一方时,双方才能建立对话。通过套接字编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台无关的应用程序。目前,套接字已逐渐成为网络编程的通用接口。 套接字存在于其特定的通信域(即协议族)中,只有隶属于同一协议族的套接字才能建立对话。一般情况下除非通信协议支持,只有相同类型的套接字才能相互传递数据。从套接字主要有两种类型:流式套接字(TCP)、数据报套接字(UDP)。 流式套接字(SOCK_STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且发送的数据时按顺序被接受的。所有利用该套接字进行传递的数据均被视为连续的字节流且无长度限制。这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP协议使用该类接口,但其对线路的占用率相对比较高。流式套接字的实现屡见不鲜,如远程登录(TELNET)、文件传输协议(FTP)等使用了流式套接字。 数据报套接字(SOCK_DGRAM):数据报套接字提供了面向无连接的服务。它独立地以数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序,因此可能出现数据的重发、丢失等现象,并且接受顺序由具体路由决定。然而,数据报的实现对网络线路占有率较低,NFS(网络文件系统)采用此类套接字,在TCP/IP 协议族中,UDP(UserDatagramProtocol)使用该类接口。
1.CFSocket
CFSocket是对BSD套接字的一个抽象封装,它提供了BSD套接字的几乎全部功能,还集成了 run-loop。CFSocket可以处理任何类型的套接字,而不仅仅限于流式套接字。
(1)创建CFSocket
常用的方法是CFSocketCreate 和CFSocketCreateWithNative。
CFSocketCreate 方法声明如下:
CFSocketRef CFSocketCreate (
CFAllocatorRef allocator, //指定创建新套接字的内存分配器类型,传入NULL或kCFAllocatorDefault可以使用默认的分配器。一般默认即可。
SInt32 protocolFamily, //指定套接字的协议族。默认使用PF_INET,也就是平时说的IPV4。指定PF_INET6以使用IPV6协议。
SInt32 socketType, //套接字类型,SOCK_STREAM或SOCK_DGRAM。
SInt32 protocol, //套接字使用的协议,IPPROTO_TCP或IPPROTO_UDP。此项需要与套接字类型一致,设为0取默认值(如果socketType为SOCK_STREAM,此项默认值为IPPROTO_TCP,否则为IPPROTO_UDP)。
CFOptionFlags callBackTypes, //CFSocket提供的run-loop可以在特定件发生时回调指定的函数。这个参数使用了位掩码,因此可以使用按位或运算指定多个类型。苹果公司将一些类型定义为枚举值如下所示:
枚举值
enum CFSocketCallBackType {
kCFSocketNoCallBack = 0,
kCFSocketReadCallBack =1,
kCFSocketAcceptCallBack =2,
kCFSocketDataCallBack = 3,
kCFSocketConnectionCallBack = 4,
kCFSocketWriteCallBack =8
};
typedef enum CFSocketCallBackType CFSocketCallBackType;
CFSocketCallBack callout,//指定回调函数,当指定的事件类型中的一个发生时函数被调用。这样,不用自己写循环等待连接、发送数据了。
const CFSocketContext *context //存储与套接字相关信息的数据结构,里面可以包含自定义数据。函数会将里面的内容拷出来,因此函数调用完后参数指向的内存不必再保留。可以为NULL。
);
CFSocketCreateWithNative方法,可以使用一个已经存在的BSD套接字来创建CRSocket,
CFSocketRef CFSocketCreateWithNative
{
CFAllocatorRef allocator,
CFSocketNativeHandle sock,
CFOptionFlags callBackTypes,
CFSocketCallBack callout,
const CFSocketContext *context
};
2.套接字函数
创建好CFSocket后,就可以使用它提供的一系列函数了。通过CFSocketNative函数,还可以操作更底层的BSD套接字。以下几个函数式CFSocket中常用的。
(1)CFSocketGetNative 返回系统套接字,通常是int类型的。获得这个套接字,可以使用Unix系统原生的套接字操作。调用setsockopt函数。
(2) CFSocketConnectToAddress 用于将套接字连接到一个正在监听的套接字(服务器)。
(3)CFSocketCopyAddress 返回CFSocket的地址,可以知道套接字正在哪个IP地址上监听。
(4)CFSocketCopyPeerAddress 获得CFSocket连接到的远程套接字的地址。
(5)CFSocketCreateRunLoopSource 为CFSocket创建一个CFRunLoop。
(6)CFSocketSendData 发送数据,需要传入CFSocket、地址(NULL则发送到套接字已经连接到的地址)、要发送的数据(CFDataRef类型)、超时时间。返回值有kCFSocketSuccess、kCFSocketError和kCFSocketTimeout 3种。
3.回调函数
函数类型定义
typedef void (*CFSocketCallBack)(
CFSocketRef s,
CFSocketCallBackType callbackType,
CFDataRef address,
const void *data,
void *info
) ;
函数声明
void CallBackTest
(
CFSocketRef s,
CFSocketCallBackType callbackType,
CFDataRef address,
const void *data,
void *info
) ;
每个回调函数可以获得以下信息,根据类型不同,一些信息也会不一样。
(1)CFSocketRefs 事件对应的CFSocket,这样可以区分不同套接字产生的事件。
(2)CFSocketCallBackType callbackType 标识哪一种事件发生了。
(3)CFDataRef address 包含底层sockaddr信息的CFData指针。可以通过这个参数获得的套接字连接到的远程地址。只有在kCFSocketAcceptCallBack和kCFSocketDataCallBack事件发生时才会提供这个参数。
(4)const void *data 根据回调类型指向不同的数据。如果是kCFSocketDataCallBack类型,这个参数为CFDataRef类型,包含接收到的数据;如果是kCFSocketAcceptCallBack类型,这个参数为指向CFSocketNativeHandle的指针;如果为kCFSocketConnectCallBack,连接在后台失败了,这个参数是指向SInt32类型错误代码的一个指针。其他情况这个参数为NULL。
(5)void *info CFSocketContext结构体中的info成员,是自定义数据。CFSocketContext是在创建CFSocket时被指定的。
4.CFSocketContext
它是包含自定义数据及一些回调的结构体。 因为CFSocket通过run-loop异步通知发生的事件,当有很多连接的时候,如何保持对每个连接相关数据的跟踪变得困难起来。CFSocketContext允许为套接字绑定任何类型的数据,每个回调函数都可以得到这个数据。
CFSocketContext
struct CFSocketContext
{
CFIndex version;//结构体的版本号,要求必须为0。
void *info;//指向自定义数据的指针,在CFSocket创建时被关联的。
CFAllocatorRetainCallBack retain;//对info指针的retain回调,可以为NULL。
CFAllocatorReleaseCallBack release;//对info指针的release回调,可以为NULL。
CGAllocatorCopyDescriptionCallBack copyDescription; //对info指针的copy description回调,可以为NULL。
} ;
typedef struct CFSocketContext CFSocketContext;
来自:http://www.cnblogs.com/hanjun/archive/2012/11/16/2774107.html
相关文章:
http://flandycheng.blog.51cto.com/855176/789625/
http://blog.csdn.net/nono_love_lilith/article/details/7573636
ios开发 网络编程浅析(一)的更多相关文章
- IOS开发——网络编程总汇
关于IOS的网络编程,大家都会想到C实现的底层BSD ,CFNetwork和NSURL之类的库,虽然如今非常多第三方库非常方便,可是作为一名开发人员,也须要了解底层代码. 以下的思维导图是关于眼下开发 ...
- iOS开发——网络编程Swift篇&Alamofire详解
Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...
- iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备
XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...
- iOS开发——网络编程OC篇&Socket编程
Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作 ...
- iOS开发——网络编程OC篇&使用WebView构建HyBird应用
使用WebView构建HyBird应用 HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap 一:首先,写好html代码 <!DOCTYPE ...
- iOS开发——网络编程Swift篇&(八)SwiftyJSON详解
SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...
- iOS开发——网络编程Swift篇&(七)NSURLSession详解
NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...
- iOS开发——网络编程Swift篇&(二)同/异&步请求
同/异&步请求 同步: // MARK: - 同步请求 func httpSynchronousRequest() { //创建NSURL对象 var url:NSURL! = NSURL(s ...
- iOS开发——网络编程Swift篇&(一)网络监测
网络监测 enum ReachabilityType { case WWAN, WiFi, NotConnected } public class Reachability { /** :see: O ...
随机推荐
- CSS 实现加载动画之三-钢琴按键
今天做的这个动画实现也是非常简单,简单数几行代码就可以搞定.给这个动画取了个优雅的名字--钢琴按键,也实在是想不出什么更形象的名字了.废话不多说,直接上图. 1. 先看gif图 2. 代码实现思路 2 ...
- ace布置小作业: 制作一个简单的电话号码归属地查询软件:JSON解析和Volly发送get请求
大概就这个样子 用到JSON解析和Volly发送Get请求两个知识点 关于Volly的用法请看我的这篇: http://www.cnblogs.com/AceIsSunshineRain/p/5177 ...
- Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11
Windows下虚拟机安装Mac OS X -– VM12安装Mac OS X 10.11 随着Iphone在国内大行其道,越来越多的开发者涌入iOS开发大军 中,但都苦于没有苹果机,本文即将介绍WI ...
- Linux(9.21-9.27)学习笔记
一.Vim的基本操作. Normal模式下 1.h 键 向左移动光标 2. j 键 向下移动光标 3. k 键 向上移动光标 4. l键 向右移动光标 5.x 键 删除光标所在位置的 ...
- Linux第五次实验
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级: 201352 姓名:池彬宁 贺邦 学号:2013521 ...
- 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput
前言 今天利用中午午休时间,给大家分享推荐一款基于Angularjs的自动完成(Autocomplete)标签及标签组插件--ngTagsInput,功能超强大的.不信,你试试就知道^_^... Au ...
- 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样!
2012年08月05日,Iveely Search Engine 0.1.0发布,今天,怀着对于未来的追求,终于,0.7.0如期和大家见面了,7个版本,历时2年4个月,感谢大家的支持,感谢我不离不弃的 ...
- Bootstrap3.0学习第二十五轮(JavaScript插件——折叠)
详情请查看http://aehyok.com/Blog/Detail/31.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- 警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:CurrencyClientServe
有的说: 在Servers视图里双击创建的server,然后在其server的配置界面中选中"Publish module contexts to separate XML files&qu ...
- Android Fresco (Facebook开源的图片加载管理库)
Fresco是Facebook开源的一个图片加载和管理库. 这里是Fresco的GitHub网址. 同类型的开源库市面有非常多,比如Picasso, Universal Image Loader, G ...