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

解析数据帧的代码:

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. Android 优化性能之 如何避免--过度绘制

    可能有些人不明白什么是过度绘制,简单言,我们app一个页面所显示的效果是由像素一帧一帧绘制而成.过度绘制就是意味着这一帧被绘制多次.如果是静态的布局,可能影响不是很大,如果是动态的,比如ListVie ...

  2. 我的MYSQL学习心得 mysql的权限管理

    这一篇<我的MYSQL学习心得(十三)>将会讲解MYSQL的用户管理 在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有: 1.user表 2.db表 ...

  3. Java程序栈信息文件中的秘密(五)

    最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切 ...

  4. POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)

    题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...

  5. 【转】adb.exe,start-server' failed -- run manually if necessary

    [转]Android adb.exe程序启动不起来,如何处理 解决问题: 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某 ...

  6. 浅谈Servlet(三)

    一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...

  7. QT中QWidget、QDialog及QMainWindow的区别

    本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...

  8. Linux Mysql Client 查询中文乱码

    1.mysql client 端设置编码为utf8 set character_set_results=utf8; 2.连接linux的客户端的编码也要设置为utf8(比如xshell,putty等)

  9. java 多个文件打包zip

    /** * 多个文件打包成zip */ public class ZipDemo { private static void create() throws Exception{ String pat ...

  10. C-重定向

    说实话,第一次接触重定向这一个概念,感觉是那么的神奇简洁不可思议…………………… freopen() 本来应该是打开的是文件指针,但是分配了指针,使她(亲切)指向了标准输入.输出.错误流. 用 法: ...