ios开发教程socket的原理和使用_第1页
ios开发教程socket的原理和使用_第2页
ios开发教程socket的原理和使用_第3页
ios开发教程socket的原理和使用_第4页
ios开发教程socket的原理和使用_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iOS 开发教程 Socket 的原理和使用 1. iOS 网络编程层次结构 iOS 网络编程层次结构分为三层,从上往下依次为: - Cocoa 层:NSURL,Bonjour,Game Kit,WebKit - Core Foundation 层:基于 C 的 CFNetwork 和 CFNetServices - OS 层:基于 C 的 BSD Socket Cocoa 层:是最上层的基于 Objective-C 的 API,比如 URL 访问, NSStream,Bonjour,GameKit 等,这是大多数情况下我们常用的 API。Cocoa 层是基于 Core Foundation 实现的。 Core Foundation 层:因为直接使用 socket 需要更多的编程工作,所以苹果对 OS 层 的 socket 进行简单的封装以简化编程任务。该层提供了 CFNetwork 和 CFNetServices, 其中 CFNetwork 又是基于 CFStream 和 CFSocket。 OS 层:最底层的 BSD Socket 提供了对网络编程最大程度的控制,但是编程工作也是 最多的。因此,苹果建议我们使用 Core Foundation 及以上层的 API 进行编程。 本文将介绍如何在 iOS 系统下使用最底层的 Socket 进行编程。 2. 什么是 Socket Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。 2 2.1 TCP 和 UDP 的区别 TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模 式)、速度慢,建立连接需要开销较多(时间,系统资源)。 UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。 关于 TCP 是一种流模式的协议,UDP 是一种数据包模式的协议,这里要说明一下,TCP 是面向连接的,也就是说,在连接持续的过程中,Socket 中收到的数据都是由同一台主机 发出的(劫持什么的不考虑) ,因此,知道保证数据是有序的到达就行了,至于每次读取多 少数据自己看着办。 而 UDP 是无连接的协议,也就是说,只要知道接收端的 IP 和端口,且网络是可达的, 任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会 乱套。比如,主机 A 向发送了报文 P1,主机 B 发送了报文 P2,如果能够读取超过一个报文 的数据,那么就会将 P1 和 P2 的数据合并在了一起,这样的数据是没有意义的。 2.2 常用的 Socket 类型 有两种:流式 Socket(SOCK_STREAM)和数据报式 Socket(SOCK_DGRAM) 。流式是一种 / 北京千锋互联科技有限公司 版权所有 面向连接的 Socket,针对于面向连接的 TCP 服务应用;数据报式 Socket 是一种无连接的 Socket,对应于无连接的 UDP 服务应用。 2.2.1 TCP C/S 架构程序设计基本框架 2.2.2 TCP 三次握手 4 最形象理解: 你瞅啥? 瞅你咋地? 来咱俩唠唠。 然后就唠上了。 2.2.3 TCP 四次挥手 / 北京千锋互联科技有限公司 版权所有 2.2.4 基于 TCP 的套接字代码实现 相关头文件。 #include #include #include #include #include 服务端实现代码。 - (void)socketServer int err; / 1. 创建 socket 套接字 / 原型:int socket(int domain, int type, int protocol); / domain:协议族 type:socket 类型 protocol:协议 int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); BOOL success = (fd != -1); if (success) NSLog(“Socket 创建成功“); / 地址结构体 struct sockaddr_in addr; / 内存清空 memset( 6 / 内存大小 addr.sin_len=sizeof(addr); / 地址族,在 socket 编程中只能是 AF_INET addr.sin_family=AF_INET; / 端口号 addr.sin_port=htons(1024); / 按照网络字节顺序存储 IP 地址 addr.sin_addr.s_addr=INADDR_ANY; / 2. 建立地址和套接字的联系(绑定) / 原型:bind(sockid, local addr, addrlen) err=bind(fd, (const struct sockaddr *) success=(err=0); / 3. 服务器端侦听客户端的请求 if (success) NSLog(“绑定成功“); / listen( Sockid ,quenlen) quenlen 并发队列 err=listen(fd, 5);/开始监听 success=(err=0); if (success) NSLog(“监听成功“); / 4. 一直阻塞等到客户端的连接 while (true) struct sockaddr_in peeraddr; int peerfd; socklen_t addrLen; addrLen = sizeof(peeraddr); NSLog(“等待客户端的连接请求“); / 5. 服务器端等待从编号为 Sockid 的 Socket 上接收客户端连接请求 / 原型:newsockid=accept(Sockid,Clientaddr, paddrlen) peerfd = accept(fd, (struct sockaddr *) success=(peerfd!=-1); / 接收客户端请求成功 if (success) NSLog(“接收客户端请求成功,客户端地址:%s, 端口号: %d“,inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port); send(peerfd, “欢迎进入 Socket 聊天室“, 1024, 0); / 6. 创建新线程接收客户端发送的消息 NSThread detachNewThreadSelector:selector(reciveMessage:) toTarget:self withObject:(peerfd); / 北京千锋互联科技有限公司 版权所有 - (void)reciveMessage:(id) peerfd int fd = peerfd intValue; char buf1024; ssize_t bufLen; size_t len=sizeof(buf); / 循环阻塞接收客户端发送的消息 do bufLen = recv(fd, buf, len, 0); / 当返回值小于等于零时,表示 socket 异常或者 socket 关闭,退出循环阻 塞接收消息 if (bufLen 2.2.10 UPD 套接字实现代码 #include - (NSString *)getIPAddress NSString *address = “error“; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; / retrieve the current interfaces - returns 0 on success success = getifaddrs( if (success = 0) / Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) if(temp_addr-ifa_addr-sa_family = AF_INET) / Check if interface is en0 which is the wifi connection on the iPhone if(NSString stringWithUTF8String:temp_addr-ifa_name isEqualToString:“en0“) / Get NSString from C String address = NSString stringWithUTF8String:inet_ntoa(struct sockaddr_in *)temp_addr-ifa_addr)- sin_addr); 12 temp_addr = temp_addr-ifa_next; / Free memo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论