1、分析tcp粘包和丢包的原因

发送数据的时候有  发送缓冲区senBuff,

接收数据的时候有  接收缓冲区recvBuff,

假如接收数据方一直不recv, 则recvBuff就会堆满, 这个时候tcp就会停止发送数据了。

同样因为接收缓冲区的数据满了, 所以发送缓冲区也不会再就收发送方发来的消息。

2、解决方案

// 接收数据  处理年包 拆分包
int CEasyTcpClient::RecvData()
{//char szRecv[1024] = {};printf("RecvData, 11111");// 5 接收客户端请求int nLen = (int)recv(m_sock, m_szRecv, RECV_BUFF_SIZE, 0);if (nLen <= 0){printf("<socket = %d>与服务器断开连接, 任务结束。 \n", (int)m_sock);return -1;}printf("client recv data , nLend = %d\n", nLen);//将收取到的数据拷贝到消息缓冲区memcpy(m_szMsgBuf + m_nLastPos, m_szRecv, nLen);//消息缓冲区的数据尾部位置后移m_nLastPos += nLen;//判断消息缓冲区的数据长度大于消息头DataHeader长度while (m_nLastPos >= sizeof(DataHeader)){//这时就可以知道当前消息的长度DataHeader* header = (DataHeader*)m_szMsgBuf;//判断消息缓冲区的数据长度大于消息长度if (m_nLastPos >= header->dataLength){//消息缓冲区剩余未处理数据的长度int nSize = m_nLastPos - header->dataLength;//处理网络消息OnNetMsg(header);//将消息缓冲区剩余未处理数据前移memcpy(m_szMsgBuf, m_szMsgBuf + header->dataLength, nSize);//消息缓冲区的数据尾部位置前移m_nLastPos = nSize;}else {//消息缓冲区剩余数据不够一条完整消息break;}}return 0;
}

类似这样的大概思路就是  接收到数据存到一级缓冲区, 然后从一级缓冲区拷贝到二级缓冲区, 之后判断二级缓冲区长度是否大于包头长度, 如果大于包头长度就进行解析,  因为包头里面包含了完整消息协议的总长度。  这样就不会出现粘包和丢包的问题了。

tcp 粘包 丢包 解决方案相关推荐

  1. iperf3测试服务器tcp带宽udp丢包率

    要使用 iperf 测试网络的性能,您需要两台计算机,一台作为服务器,一台作为客户端,这将帮助您测试两台主机之间的网段.特别注意的是两台计算机的网口一定是同样的网口,测试的数据才是准确的,我之前测试的 ...

  2. RTC 媒体流数据包丢包问题解决

    最近在一个测试中,遇到了OCS和PSTN通话之间的声音出现严重的断续问题,用户的使用体验就是听对方的声音不是完整的,有部分的语音丢失,在服务器上判断就是RTC数据包丢失了.专业术语就是Voice cl ...

  3. 记一次TCP丢包带来的重大性能问题

    背景 一个项目对接第三方接口数据.对方是TCP接口,发送数据频率很高.平均2毫秒发送三四千个字节.由于TCP协议的粘包拆包问题,我这里接收到的数据需要对粘包拆包按照对方数据的格式进行处理.对接了一段时 ...

  4. 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...

  5. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    [转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnbl ...

  6. 服务器传递文件丢包怎么回事,TCP传输协议中如何解决丢包问题

    一.回答这个问题之前,要考虑TCP协议为什么会丢包,在什么样的情况下会丢包. 1. TCP协议定义(Transimission Control Protocol)是以一种面向连接的.可靠的.基于字节流 ...

  7. 云网络丢包故障定位全景指南

    作者简介:冯荣,腾讯云网络高级工程师,腾讯云网络核心开发人员. 万字长文  建议收藏 引言 本期分享一个比较常见的⽹络问题--丢包.例如我们去ping⼀个⽹站,如果能ping通,且⽹站返回信息全⾯,则 ...

  8. 以太网速率怎么手动设置_以太网能不能不丢包?

    1 以太网能不丢包吗 大家天天上网语音.视频.聊天.追剧--,有没有感觉到网络丢包呢?可能有的会说有,有的会说没有.说有的可能会说感觉到语音或追剧时有卡顿,说没有的可能会说我聊天内容好友都毫发无损的收 ...

  9. 深度好文:云网络丢包故障定位,看这一篇就够了~

    深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...

最新文章

  1. liferay7.0 mysql_Liferay7 BPM门户开发之6: Activiti数据库换为mysql
  2. 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
  3. [How TO]-Ubuntu 20.04修改终端标题栏文字
  4. Maven pom.xml配置详解(三)
  5. php 怎么执行unoconv,web执行php调用exec(unoconv)命令失败解决方案
  6. windows下面的txt在linux下面显示为乱码
  7. android 调用系统方法,android 调用系统功窗口方法
  8. boost文件锁的使用
  9. java response设置403,java.io.IOException:服务器返回URL的HTTP响应代码:403
  10. 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
  11. C语言删除字符数组中指定的字符(C笔记)
  12. 深度学习,实现智能聊天对话机器人(大数据人工智能公司)
  13. 测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?
  14. 里奥·梅西(Lionel Messi)-----球场上舞动的红蓝精灵
  15. 如何将火星坐标(高德、谷歌、腾讯地图坐标)转换为国家2000(或WGS84)坐标系?
  16. [转载]网络数据流的java处理
  17. 关于考教师资格证的一些建议——笔试篇
  18. plt-------
  19. AlgLib 使用----稀里糊涂
  20. 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯

热门文章

  1. 51虚拟安卓系统v1.1.0.6-安卓端的虚拟机(支持root,xposed框架)
  2. win下 远程控制(教程+工具+黑客常用命令)
  3. ipad文件APP连接服务器,是时候认识一下 iPad 的文件管理了
  4. 职务犯罪嫌疑人的第十八天科达打造“镇江模式”
  5. 安全加密与证书签发工具--openssl
  6. 前端学习之浏览器从输入URL到页面加载的全过程
  7. 【通讯原理】Ch.4:数字信号调制
  8. linux系统没ip,树莓派在没有显示器情况下查找未知IP教程
  9. Echars柱状图嵌套 居中对齐 柱子占比宽度由大到小嵌套包含 并用小箭头标记当前产出位置
  10. picpick截图工具截取滚动窗口只滚动一次就结束了解决办法