什么是粘包

  粘包指的是数据与数据之间没有明确的分界线,导致不能正确读取

  应用程序无法直接操作硬件,应用程序想要发送数据则必须将数据交给操作系统,而操作系统需要同时为所有应用程序提供数据传输服务,也就意味着,操作系统不可能立马就能将应用程序的数据发送出去,就需要为应用程序提供一个缓冲区,用于临时存放数据,具体流程如下

  发送方

    当应用程序调用send函数时,应用程序会将数据从应用程序拷贝到操作系统缓存,再由操作系统从缓冲区读取数据并发送出去。

  接收方

    对方计算机收到数据也是操作系统先收到,至于应用程序何时处理这些数据,操作系统并不清楚,所以同样需要将数据先存储到操作系统的缓冲区中,当应用程序调用recv时,实际上是从操作系统缓冲区中将数据拷贝到应用程序的过程。

  上述过程对于TCP与UDP都是相同的不同之处在于;

    UDP在收发数据时是基于数据包的,即一个包一个包的发送,包与包之间有着明确的分界,到达对方操作系统缓冲区后也是一个一个独立的数据包,接收方从操作系统缓冲区将数据拷贝到应用程序

如何解决粘包问题  

  解决粘包的核心思路就是 先通知接收方 要发送数据的长度

  再发送真实数据

  问题在于 数据长度也是不确定的

  对方也不清楚 长度信息到底是几个字节  

  解决方案是 把长度信息转换为一个固定的字节的二进制数据(要用到struct模块)

 

 posted on 2019-03-04 14:43  HeiTangMuSi  阅读(169)  评论(0编辑  收藏  举报