socket tcp 粘包,分包的原因 解决方案 包处理(包头加上包体长度)

tcp的一些问题
1 socket本身就有缓存区
2 链路层有最大传送单元限制 如果包大了 要在IP层进行分包
3 tcp 的流量控制 也会导致粘包

解决方案
1 定包长
2 包尾加分隔符号
3 包头加上包体长度

本人用的是方案3
接收方式 还是用的 BeginReceive
接收消息的时候先读前4个字节 就是这个包体的长度 简称解码

写的时候也一样先写 先把包体长度固定4个字节 写到byte数组里面去
再写剩下的消息 简称编码

这里可以用流的方式进行写读

 MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter (ms);
 BinaryReader br = new BinaryReader(ms);

BinaryWriter bw; 写的时候 先写这个包体的长度
注意bw.Write(int)这样写会自动把包体长度转成4个字节数组
当然其他类型也可以写入 short类型就是2个字节 char类型 就是一个字节
== 然后写剩下的消息==

BinaryReader br; 读的时候也一样 br.ReadInt32() 先读包体长度
然后判断包体长度 是否够长 不够长 不做处理 等一下次接收数据
够长就做该做的事 再把缓存数组清空 再把流里面剩余的数据复制给缓存数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值