TCP粘包和半包的处理方法
先把处理的方法的代码放这里:
解析数据帧的代码:
bool CSocket::findData(byte* buff, int& len)
{ for (int i = 0; i <= len - 4; i++)
{
int dataLen;
if(buff[i] == 0xAA && buff[i + 1] == 0xBB)
{
short slen;
slen = (short)(byte(buff[i+3]));
slen |=(short)((short)(byte(buff[i+2])) << 8);
dataLen = slen;
if(slen < 0)
return false; if(i+4 +dataLen + 4 <= len)
{
if(buff[i + 4 + dataLen] == 0x0DD && buff[i + 4 + dataLen + 1] == 0xEE && buff[i + 4 + dataLen + 2] == 0xDD && buff[i + 4 + dataLen + 3] == 0xEE)
{
MsgType type;
memcpy(&type, buff + i + 4 , sizeof(type)); if(type == ID_LASER)
{}
else if(type == ID_PATH)
{}
else if(type == ID_POSE)
{}
len = len - i - 4 - dataLen - 4;
if( len > 0)
{
memcpy(swapBuff, buff + i + 4 + dataLen + 4, len);
memcpy(buff, swapBuff, len);
}
return true;
}
else
{
len = len - i -4;
if(len > 0)
{
memcpy(swapBuff, buff + i + 4, len);
memcpy(buff, swapBuff, len);
return false;
}
}
}//if
else if(i != 0)
{
len = len - i;
memcpy(swapBuff, buff + i, len);
memcpy(buff, swapBuff, len);
return false;
}
}//if
}//for return false;
}//end function
接收数据帧的代码:
void CSocket::receiveData()
{
ROS_INFO("Receive Thread Start..."); int len =0;
int revDateCount = 0;
while(bRunning)
{
if(!connected)
{
ROS_INFO("Restarting connection...");
ErroFunc(_T("连接中断,尝试重新连接...")); if(serverSocket > 0)
{
closesocket(serverSocket);
serverSocket = -1;
} if(clientSocket > 0)
{
closesocket(clientSocket);
clientSocket = -1;
} bool re;
if(bServer)
re = startServer();
else
re = connectServer();
if(!re)
continue;
revDateCount = 0;
MsgFunc(_T("连接到机器人!"));
} int re = selectSocket(clientSocket, 500);
if(re < 0)
{
ROS_ERROR("Receive Thread Select Error!");
connected = false;
continue;
}
else if(re == 0)
continue;
else
{
len = recv(clientSocket, (char*)recvBuffer, MAX_BUFFER_LEN, 0);
if(len > 0)
{
if(revDateCount + len < MAX_BUFFER_LEN)
{
memcpy((void*)(buff + revDateCount), (void*)recvBuffer, len);
revDateCount += len;
}
else
{
memcpy((void*)buff, (void*)recvBuffer, len);
revDateCount = len;
} while(findData(buff, revDateCount))
{
ROS_INFO("Receive data!");
}
}
else
{
ROS_ERROR("Receive Data Error!");
connected = false;
goto __reconnect__;
}
}
__reconnect__:;
}
ROS_INFO("Receive Thread Stop.");
}
TCP粘包和半包的处理方法的更多相关文章
- 关于TCP封包、粘包、半包
关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- TCP的粘包、半包和Netty的处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是粘包和半包 在客户端发送数据时,实际是把数据写入到了TCP发送 ...
- 详说tcp粘包和半包
tcp服务端和客户端建立连接后会长时间维持这个连接,用于互相传递数据,tcp是以流的方式传输数据的,就像一个水管里的水一样,从一头不断的流向另一头. 理想情况下,发送的数据包都是独立的, 现实要复杂一 ...
- Netty - 粘包和半包(上)
在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...
- C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)
介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...
- Netty - 粘包和半包(下)
上一篇介绍了粘包和半包及其通用的解决方案,今天重点来看一下 Netty 是如何实现封装成帧(Framing)方案的. 解码核心流程 之前介绍过三种解码器FixedLengthFrameDecoder. ...
- TCP的组包、半包、粘包与分包
一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...
- c# socket 解决粘包,半包
处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...
随机推荐
- Windows Phone 8.1 发送http 网络请求。
在windows phone 8.1 中可以用 HttpClient 类来发送http 请求. 例子: try { Uri uri = new Uri(@"http://api.map.ba ...
- “-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转)
JVM的堆的内存, 是通过下面面两个参数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后 ...
- 窗口嵌入到另一个窗口(VC和QT都有)
1.用vc新建一个dialog1工程.属性默认. 2.insert一个dialog2,改为child. 3.在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2: Cdial ...
- c#观察者模式学习笔记(1)
c#中的观察者是一种逻辑上很重要的角色,在服务端,观察者是服务端的通讯员,它将事件与业务紧密的结合,彼此又能按照逻辑进行分离. 实现方法为: (1)声明事件的委托原型,作为事件订阅的回调. (2)使用 ...
- Cocos2d-x:环境配置小节
一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...
- hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马】 【贪心】
思路:先按从小到大排序, 然后从最快的開始比(如果i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比較,如果等于然后推断,有三种情况: 一:大于则比較, ...
- android媒体--图库与API层MediaPlayer的交互
众所周知一个媒体播放器新建的几个步骤: Mediaplayer mp = new MediaPlayer(0 mp.setDatasource(xxx); mp.setDispalyer(xxx); ...
- hdu 4105 贪心思想
淋漓尽致的贪心思想 波谷一定是一位数.波峰一位数不够大的时候加入到两位数就一定够大了的. 当在寻找波谷碰到零了就自然当成波谷. 当在寻找波峰时碰到零时,将前面的波谷加到前一个波峰上.让当前的零做波谷, ...
- xcode initWithCoder\awakeFromNib\layoutSubviews
控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...
- U3d 手游优化概述
移动平台瓶颈 体积小 芯片要求改 功耗小 影响计算系能 带宽小 传输方面受限 性能优化 资源方面 美术方面 自带地形(地形是非常占用资源的) a.控制地形的分辨率 b.地形高度图尺寸小于257 c.地 ...