最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来。这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己回忆。

  1、socket通信原理:现网络上有很多socket开园框架文件,基本上能满足简单网络通信,但如过你的项目需要成熟的网络通信,还需要自 己对socket好好研究完善下。socket通信分为server端和client端,开发过程中分别对应着服务器和客户端。当连接上服务器 后,socket就会启动一个while或for无限循环,不断的异步监听socket动静,看是否有read或者write动作,直到出错或者主动结 束。

    socket通信传输的都是字节流,传输时没有包的概念的。至于我们经常说的包的概念,是我们制定了一定的规则形成的。常用规则有两种,一 种是制定特定的分隔符(delimiter)来分割每个包,此时必须保证每条信息体中不包含该分隔符。第二种是指定每条消息体的长度,比如,在每条消息体 之前插入一个4字节长度的无符号整形来表明后面的消息体长度(一般包体长度限制在8k大小内,遇到消息体过大的信息时,一般采用分包发送和拼包解析)。其 中第二种方式更常见一些。

    基于TCP链接的socket通信中,经常会涉及粘包、分包、解包的问题,一下久这问题简单说一下。

    粘包:使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接 着前一包数据 的尾。粘包可能由发送方造成,也可能由接收方造成。TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连。如果 接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包。
    粘包一般的解决办法是制定通讯协议,由协议来规定如何分包解包。

    分包:常用分包的逻辑是先发一个长度,然后紧接着是数据包内容,这样就可以把每个包分开。

    解包:由于我们应用层数据包既可以传命令也可以传数据,因而针对每个包我们进行解包,分出命令和数据分别处理,因而每个Socket服务对象都需要解包。解包过程中,才会出现我们常见的包头、信息体长度、信息体。

粘包、分包、解包解决方案:东家DZH:采用的是用一个足够大(500*1024)的接受缓存pRecvBuf去读区socket(recv()),然后使用君子协定让数据报的开头都是一个标准的包头信息,包头信息中包含着本包的包体长度,利用这个包体长度曲读取本包数据包体。读完后,如果该数据包还有未读数据,则重复上诉解包操作。直到完成。

东家EM:每次收到数据报时,先读取前4个字节转为无符号整形作为本消息包的长度length,然后一直重socket中read,直到读取length长度为之。这样可以解决分包发送问题,也可以解决粘包问题。

最新文章

  1. Daily Scrum Meeting ——ThirdDay(Beta)12.11
  2. Swift的期待
  3. Convert Sorted Array to Binary Search Tree || LeetCode
  4. 传入一个label或者button,传入5s,6和6+的文字尺寸 快速定义文字大小
  5. DownloadManager补漏
  6. 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤
  7. 【BZOJ】【1069】【SCOI2007】最大土地面积
  8. hadoop+hbase
  9. [转]利用/*+Ordered*/提高查询性能
  10. 基于PHP的cURL快速入门
  11. POJ 3186 Treats for the Cows
  12. Memcached 内存管理详解
  13. 用ElasticSearch搭建自己的搜索和分析引擎
  14. Struts2学习笔记整理(一)
  15. JAVA库函数总结【持续更新】
  16. 最新版jQuery v3.3.1的BUG以及解决办法(什么问题不重要,怎么解决问题才重要)
  17. get 和free
  18. PHP实现微信随机红包算法和微信红包的架构设计简介
  19. c#实战开发:以太坊私链搭建(一)
  20. jmeter时间格式化

热门文章

  1. C语言面试问答5
  2. 关于Jquery 序列化表单的注意事项
  3. python打包成window可执行程序
  4. videojs设置播放点
  5. 自己动手写spring容器(1)
  6. PHP 数组拼接成字符串
  7. 登录验证全局控制的几种方式(session)
  8. 黑马程序员:Java基础总结----网络编程
  9. dll导出命名空间下的c风格函数陷阱
  10. C语言之break和continue