TCP-粘包、半包问题

3 篇文章 0 订阅
3 篇文章 0 订阅

我制定的网络协议

[packlen,packcount,nowpack,data,datalen]
packlen占4字节这个包的总字节数。
packcount占4字节某些业务可能要发送很长的数据,但是一次性发送太多的数据会不稳定,所以业务层要讲数据切片分开,packcount就是指,此次数据交互总共发送了多少数据包。
nowpack占4字节与packcount配合使用,代表当前包是第几个包。
data占packlen-4 -4个字节这个包数据实体。
packlen占4个字节最后在写入这个包的总字节数,用了与头部的packlen相呼应。

实例

//创建数据包;
char* CreatePack(int packCount, int nowPack, char* data, int datalen, int* out_packlen)
{
	//第1个4是packlen,第2个4是packCount, 第3个4是nowPack,最后一个5是packlen;
	int packlen = 4 + 4 + 4 + datalen + 4;
	char* buffer = (char*)malloc(packlen);
	
	memcpy(buffer, (char*)&packlen, 4);
	memcpy(buffer + 4, (char*)&packCount, 4);
	memcpy(buffer + 8, (char*)&nowPack, 4);
	memcpy(buffer + 12, data, datalen);
	memcpy(buffer + 12 + datalen, (char*)&packlen, 4);
	*out_packlen = packlen;
	return buffer;
}

       例如,要发送"hello",5个字节,那么这个包应该是这样的:
在这里插入图片描述

接收端

  1. 调用API只读取4个字节转换为一个int,命名为packlen;
  2. 第二次调用API读取packlen-4个字节,命名为packdata,也就是协议中packlen后面的数据;
  3. 我们知道协议中最后的4个字节也是packlen,那么,(int)(packdata + (packlen-4-4))就应该等于packlen的值,可以用来判断这个包的正确性;
  4. *packdata 就是packcount;
  5. *(packdata+4)就是packnow;
  6. (packdata+8)就是data,那么data到哪结束呢?到packlen-4-4这个位置结束。
  7. 把(packdata+8)到(packdata+(packlen-4-4))这段数据发送给业务层进行处理。
  8. 循环往复。

       如此一来,粘包的问题就解决了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值