了解socket,就需要了解数据在网络中传输。

  网络通讯有三要素:ip地址,网络中设备的表示,例如本机用127.0.0.1,或者用本机名:localhost;端口号,用来标示进程的逻辑地址,也就是服务,有效端口0~65535,一般1024以下端口被系统或者本地服务所占据,开发中尽量不要使用,以避免冲突;通讯协议——UDP,TCP,UDP是用户数据报文协议,只负责发送数据,并不管是否被接收,不会建立联接,其会将数据和目的封装到数据包中。每个包大小为64K以内,数据传输速度很快,但是并不安全,一般用在游戏,直播之类的行业中;TCP则需要建立联接来传输数据,不会对数据做大小限制,需要通过三次握手协议来完成连接,安全可靠,缺点便是效率低。

  三次握手建立连接:

  

首先client发送连接请求到服务器,服务器同意连接发送ACK报文,并为这次连接分配资源;client接收到ACK报文后,也向服务器发送ack报文,并为连接分配资源,这样TCP连接就建立成功。断开时采用四次挥手协议:

  client发送断开连接请求,FIN报文,服务器接收到FIN报文了,知道client已经准备好结束连接,不再传输数据,但是如果服务器端没有准备好,不用着急关闭scoket,仍然可以发送数据前往client,此时需要发送ACK报文,告诉client请等待结束,让client进去FIN_WAIT状态。当服务器确定完成数据发送并可以关闭,发送FIN报文进入client,client接收到FIN报文后,并不会立刻断开连接,为了避免错误关闭状态,例如服务器没打算关闭连接,会向服务器发送ACK报文,并会进入TIME_WAIT状态,等待2MSL后未接收到服务器回应变正式断开连接,而服务器在接收到ACK报文后也会断开连接。

  UDP会涉及到数据打包发送,这其中会需要了解osi七层模型:

  

  进行数据传输,首先应用层形成源,然后在传输层通过TCP/UDP协议包装,在网络层,确定ip和端口号(形成socket),建立数据传输io,在数据链路层打包数据,每一包数据即为一帧,最后通过物理层转为电信号,电信号的传输标示采用高低电平,其实就是01数据,即二进制数据传输,所以网络中数据传输形式都是二进制。

  了解这么多后,再来看socket概念。网络通信就是socket间的通信,需要两端都是socket,然后这两端建立IO传输。可以这样理解,socket是一种网络机制类,实例化的具体信息就是ip+端口。当我们使用qq聊天,a手机IP+qq端口发送信息,需要找到b手机IP+qq端口才能接收数据;

  socket本身是用c语言书写,方便跨平台使用,使用起来也非常简单,基本可以归位五步。一步,创建socket,第二步,建立connect,第三步,write数据,第四步read数据,第五步colse;

  

  首先,打开终端,输入命令:nc -lk 1025(监听端口号1025)

  导入头文件:

  

#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

  按操作创建socket连接:

1.创建socket

  

 /**参数socket三个参数传入相应值domain:    协议域,AF_INET -> IPV4 AF_INET6 -> IPV6type:      Socket 类型,SOCK_STREAM数据流/SOCK_DGRAM数据报文protocol: IPPROTO_TCP,如果传入0 那么会自动根据第二个参数选择合适的协议返回值socket*/int clientSocket = socket(AF_INET, SOCK_STREAM, 0);

2.连接服务器

    /**参数1> 客户端socket2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址3> 结构体数据长度返回值0 成功/其他 错误代号*/struct sockaddr_in severAddr;severAddr.sin_family = AF_INET;//端口severAddr.sin_port = htons(1025);//地址severAddr.sin_addr.s_addr = inet_addr("127.0.0.1");int connResult =  connect(clientSocket, (const struct sockaddr *)&severAddr, sizeof(severAddr));if (connResult == 0) {NSLog(@"连接成功!!");}else{NSLog(@"失败了 %d",connResult);return;}

3.write数据,写入hello world 可以在简单端口看到相应展示

  

 /**参数1> 客户端socket2> 发送内容地址3> 发送内容长度4> 发送方式标志,一般为0返回值如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR*/NSString * sendMsg =@"hello world";ssize_t sendLen = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);

4.read数据,在端口下写入me too可以看到xcode打印结果展示

  

   /**参数1> 客户端socket2> 接收内容缓冲区地址3> 接收内容缓存区长度4> 接收方式,0表示阻塞,必须等待服务器返回数据返回值如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR*/uint8_t buffer[1024];//要把空间准备出来!
    ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);

5.最后便是便是关闭socket

close(clientSocket);

转载于:https://www.cnblogs.com/zhulilove/p/8016557.html

iOS学习——Socket相关推荐

  1. ios学习 准备列表

    2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...

  2. iOS 学习资料整理

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  3. ios学习--iphone开发笔记和技巧总结(原址持续更新)

    ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...

  4. iOS -- 学习资料总结(转载)

    先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...

  5. iOS 学习资料整理(中文版)

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  6. iOS学习资源汇总(开源项目、第三方库、技术博客等等)

    iOS学习资源汇总(开源项目.第三方库.技术博客等等) 字数3919 阅读10309 评论29 喜欢297 前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你 ...

  7. iOS学习资源汇总 - 开源项目、第三方库、技术博客

    前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你想,只要Ta有. 从事开发几年在Github上Star了不少好的东西,当然学到了更多,在此深深的膜拜下那些开 ...

  8. iOS学习资源汇总(开源项目、第三方库、技术博客)

    本文转自:http://www.jianshu.com/p/b7c4a787a597 仅供学习 前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你想,只要Ta ...

  9. iOS 学习资料大全

    转:  http://segmentfault.com/a/1190000002473595 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他 ...

最新文章

  1. shell python -c_python, shell, C/C++ 从命令行获得参数
  2. Fedora 31 正式版今天发布,Python不是传说的3.8,而是3.7.4
  3. Linux学习:gcc 编译其他常用参数
  4. mysql备份时候事务日志_SQLSERVER备份事务日志的作用
  5. 用Fidder实现IOS手机抓包
  6. Math中的常用方法
  7. php-protobuf扩展和代码生成工具使用
  8. mysql解压缩版配置_MySQL 5.6 for Windows 解压缩版配置安装
  9. git github gitlib gitlab
  10. urllib常用小记
  11. 合作 | 2018数博会AI全球赛项目征集!提供场景、数据集,总奖金池500万
  12. 构建自己的NSZombie
  13. MATLAB点与点之间连线
  14. java .class 反编译工具推荐
  15. centos7安装tomcat8
  16. 自己收集的全国行政区划,具体到县级,不包括过直辖市和特别行政区
  17. Win10怎么合并磁盘分区 合并磁盘的操作方法
  18. 2017年5月20日软考考试报名开始啦
  19. 数据递归查询的两种实现方法
  20. GIT(分布式版本控制系统)入门

热门文章

  1. Nginx反向代理实现负载均衡web集群
  2. oralce9i备份的数据导入到oralce10g中的过程
  3. angularjs1-8,cacheFactory,sce
  4. strust2 和 hibernate的整合------登录的实现
  5. Linux/Unix操作系统目录结构的来历
  6. Linux——系统引导流程学习简单笔记
  7. 使用Eclipse构建GeoTools项目
  8. 自己构造公共程序(3)--DataGrid小方法
  9. android 移除泛型中元素_最新(2020)Android高级面试知识点干货分享(二)
  10. 算法学习(二)快速排序(下)