php socket 粘包,socket 编程中的粘包问题

首先,需要明确什么是tcp中的粘包问题(具体可wiki),我这里大致描述下:

tcp粘包就是指在tcp的网络编程(当然不止tcp,其他粘包也差不多意思)中,由于tcp是流式的,tcp提供给应用层的接口,无法获知发送端一次发了多少数据,也没办法获知发送端发了多少数据,就造成下一次数据头紧跟着上上一次数据尾,直接提供给应用层,应用层无法感知何处是发送端一次发送的边界。

下面说一下tcp粘包具体的原因:是发送端tcp层可能会对数据封装成多个tcp段,不仅如此,还会对应用层的多次数据组成一个包,比如应用层第一次写'A',第二次写'B',第三次写'C',在Tcp层很可能是发送一个tcp段,包含的数据是'ABC',所以,这样不管是接收端是否一次读一个tcp段,都无法分辨出哪里是发送端应用层边界,俗称"粘包"。

好,下面就简单说一下楼主(主要的错误也就1点):

图片描述

如我上面所说,接收端以如何的方式处理都不是粘包的根本原因,因此,接收端一次读一个tcp段也是会造成粘包现象,从而到处严重的错误。

那么如何解决粘包:

被采纳的答案的两条建议都是正确的,不过第一条容易让人引起误会,以为tcp可以一次读出定长的数据。

没什么好办法,就是应用层自己设置协议解决粘包问题,最典型的就是采用协议头部和数据的方式。注意的是,这里应该用状态机实现接收端的功能,因为你不能确定发送端发了完整的头部,你就一定能收到完整的头部。

最简单的办法就是设置8个字节的头部,表示数据长度,接着就是数据。

那么发送端先发送8个字节的一个数字,表示接下来的数据大小是多少,接着将数据全部发送过去。接收端一直接受数据,一直等到接受满了8个数据,取出来,计算出大小(假设为n),接着继续读取n个字节,就是完整的一个应用层的包了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值