tcp 粘包 丢包 解决方案
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 粘包 丢包 解决方案相关推荐
- iperf3测试服务器tcp带宽udp丢包率
要使用 iperf 测试网络的性能,您需要两台计算机,一台作为服务器,一台作为客户端,这将帮助您测试两台主机之间的网段.特别注意的是两台计算机的网口一定是同样的网口,测试的数据才是准确的,我之前测试的 ...
- RTC 媒体流数据包丢包问题解决
最近在一个测试中,遇到了OCS和PSTN通话之间的声音出现严重的断续问题,用户的使用体验就是听对方的声音不是完整的,有部分的语音丢失,在服务器上判断就是RTC数据包丢失了.专业术语就是Voice cl ...
- 记一次TCP丢包带来的重大性能问题
背景 一个项目对接第三方接口数据.对方是TCP接口,发送数据频率很高.平均2毫秒发送三四千个字节.由于TCP协议的粘包拆包问题,我这里接收到的数据需要对粘包拆包按照对方数据的格式进行处理.对接了一段时 ...
- 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免
使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...
- 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
[转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏 http://www.cnbl ...
- 服务器传递文件丢包怎么回事,TCP传输协议中如何解决丢包问题
一.回答这个问题之前,要考虑TCP协议为什么会丢包,在什么样的情况下会丢包. 1. TCP协议定义(Transimission Control Protocol)是以一种面向连接的.可靠的.基于字节流 ...
- 云网络丢包故障定位全景指南
作者简介:冯荣,腾讯云网络高级工程师,腾讯云网络核心开发人员. 万字长文 建议收藏 引言 本期分享一个比较常见的⽹络问题--丢包.例如我们去ping⼀个⽹站,如果能ping通,且⽹站返回信息全⾯,则 ...
- 以太网速率怎么手动设置_以太网能不能不丢包?
1 以太网能不丢包吗 大家天天上网语音.视频.聊天.追剧--,有没有感觉到网络丢包呢?可能有的会说有,有的会说没有.说有的可能会说感觉到语音或追剧时有卡顿,说没有的可能会说我聊天内容好友都毫发无损的收 ...
- 深度好文:云网络丢包故障定位,看这一篇就够了~
深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...
最新文章
- liferay7.0 mysql_Liferay7 BPM门户开发之6: Activiti数据库换为mysql
- 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
- [How TO]-Ubuntu 20.04修改终端标题栏文字
- Maven pom.xml配置详解(三)
- php 怎么执行unoconv,web执行php调用exec(unoconv)命令失败解决方案
- windows下面的txt在linux下面显示为乱码
- android 调用系统方法,android 调用系统功窗口方法
- boost文件锁的使用
- java response设置403,java.io.IOException:服务器返回URL的HTTP响应代码:403
- 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
- C语言删除字符数组中指定的字符(C笔记)
- 深度学习,实现智能聊天对话机器人(大数据人工智能公司)
- 测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?
- 里奥·梅西(Lionel Messi)-----球场上舞动的红蓝精灵
- 如何将火星坐标(高德、谷歌、腾讯地图坐标)转换为国家2000(或WGS84)坐标系?
- [转载]网络数据流的java处理
- 关于考教师资格证的一些建议——笔试篇
- plt-------
- AlgLib 使用----稀里糊涂
- 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯
热门文章
- 51虚拟安卓系统v1.1.0.6-安卓端的虚拟机(支持root,xposed框架)
- win下 远程控制(教程+工具+黑客常用命令)
- ipad文件APP连接服务器,是时候认识一下 iPad 的文件管理了
- 职务犯罪嫌疑人的第十八天科达打造“镇江模式”
- 安全加密与证书签发工具--openssl
- 前端学习之浏览器从输入URL到页面加载的全过程
- 【通讯原理】Ch.4:数字信号调制
- linux系统没ip,树莓派在没有显示器情况下查找未知IP教程
- Echars柱状图嵌套 居中对齐 柱子占比宽度由大到小嵌套包含 并用小箭头标记当前产出位置
- picpick截图工具截取滚动窗口只滚动一次就结束了解决办法