先把处理的方法的代码放这里:

解析数据帧的代码:

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粘包和半包的处理方法的更多相关文章

  1. 关于TCP封包、粘包、半包

    关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...

  2. socket编程 TCP 粘包和半包 的问题及解决办法

    一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...

  3. TCP的粘包、半包和Netty的处理

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是粘包和半包 在客户端发送数据时,实际是把数据写入到了TCP发送 ...

  4. 详说tcp粘包和半包

    tcp服务端和客户端建立连接后会长时间维持这个连接,用于互相传递数据,tcp是以流的方式传输数据的,就像一个水管里的水一样,从一头不断的流向另一头. 理想情况下,发送的数据包都是独立的, 现实要复杂一 ...

  5. Netty - 粘包和半包(上)

    在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...

  6. C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)

    介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...

  7. Netty - 粘包和半包(下)

    上一篇介绍了粘包和半包及其通用的解决方案,今天重点来看一下 Netty 是如何实现封装成帧(Framing)方案的. 解码核心流程 之前介绍过三种解码器FixedLengthFrameDecoder. ...

  8. TCP的组包、半包、粘包与分包

    一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...

  9. c# socket 解决粘包,半包

    处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...

随机推荐

  1. axis1客户端调用webservice的通用代码

    1.axis1 作为web service 客户端时,调用web service 服务端的通用代码 String url = "http://www.webxml.com.cn/webser ...

  2. c#观察者模式学习笔记(1)

    c#中的观察者是一种逻辑上很重要的角色,在服务端,观察者是服务端的通讯员,它将事件与业务紧密的结合,彼此又能按照逻辑进行分离. 实现方法为: (1)声明事件的委托原型,作为事件订阅的回调. (2)使用 ...

  3. 第七届河南省赛H.Rectangles(lis)

    10396: H.Rectangles Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 229  Solved: 33 [Submit][Status] ...

  4. 设置android:supportsRtl=&quot;true&quot;无效问题

     今天解bug时,遇到这样一个问题:   问题描写叙述:切换系统语言为阿拉伯文时,actionbar布局没有变为从右向左排列.   于是,我在Androidmanifest.xml文件里的 appli ...

  5. HTML技术简介

    1.DHTML:"Dynamic HTML"动态HTML技术的简称.DHTML并不是一项新技术,而是HTML,CSS,JavaScript技术组合的术语.DHTML背后的含义是: ...

  6. ASP.NET之电子商务系统开发-2(购物车功能)

    一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...

  7. IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度

    在一些项目中,我们需要自定义自己的UIButton,使Button上面同时具有图片和文字描述,实现自定义UIButton的图文混排. 首先我们需要定义一个继承自UIButton的类,同时实现自己的in ...

  8. Android应用开发基础篇(13)-----GestureDetector(手势识别)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/05/2381025.html 一.概述 GestureDetector是一个用于识别手势的类,这 ...

  9. C#中网站根路径、应用根路径、物理路径、绝对路径,虚拟路径的区别

    C#中网站根路径,请站点的最外一层 /表示 应用根路径 ~/表示,有时候C#程序路径并不是网站路径 物理路径 server.mappath("~/") 是指应用程序放在服务器硬盘的 ...

  10. python自学笔记(五)python文本操作

    一.python自带方法 r:read 读 w:write 写 a:append 尾行追加 先命令行进入python后 >>>d = open('a.txt','w') #在对应路径 ...