搜索
bottom↓
回复: 12

rt-thread+lwip tcp接收数据粘包的问题

[复制链接]

出0入0汤圆

发表于 2014-3-21 12:01:09 | 显示全部楼层 |阅读模式
首先感谢各位解答前几次的问题。现在我已经能够实现PC通过TCP链接连续想单片机发送数据了。但是新的问题也出现了,就是TCP粘包的问题。由于我传输的数据是有固定结构的,TCP粘包的话就破坏了数据的结构。
PC端我已经将nagle算法取消了,发送的数据的话应该是固定大小的,我设定的是1322字节。
但单片机接收的话会出现三种情况:
1.就是正常接收,PC发送1322字节,单片机netconn_recv一次接收1322字节。
2.单片机的netconn_recv会按顺序分几次接收1322字节数据。
3.单片机netconn_recv接收了超过1322字节的数据,据我观察一般为1460字节。
有什么方法能让单片机就按照固定1322字节大小接收数据呢?
实在不行我只好改用UDP连接。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-3-21 13:35:12 | 显示全部楼层
TCP是流式的。建议先看看基础书。

出0入0汤圆

 楼主| 发表于 2014-3-21 14:26:58 | 显示全部楼层
aozima 发表于 2014-3-21 13:35
TCP是流式的。建议先看看基础书。

我知道TCP是流式。不过粘包问题主要是出在Nagle算法上了,根据网上的建议我关闭了Nagle算法。
  const char chOpt=1;   
    int   nErr=setsockopt(   m_socket,   IPPROTO_TCP,   TCP_NODELAY,   &chOpt,   sizeof(char));   
    if(nErr==-1)   
    {   
     TRACE(_T("setsockopt()   error\n"),WSAGetLastError());   
     return ;   
    }
发出端应该发送的是固定大小了。
但在接收的时候仍然会出现问题。netbuf_alloc()函数分配指定字节(bytes)大小的缓冲区内存好像没有什么作用,接收数据块的大小依然会变动。没有一次接收发送大小数据的方法么?
还有种解决方法就是封包,拆包的方法,我正在尝试。

出0入0汤圆

发表于 2014-3-21 14:31:33 | 显示全部楼层
即使收发双方处理了,中间的N级路由也可能会拆封包的。
不要从不靠谱的方向找解决方案。

出0入0汤圆

 楼主| 发表于 2014-3-21 14:35:54 | 显示全部楼层
aozima 发表于 2014-3-21 14:31
即使收发双方处理了,中间的N级路由也可能会拆封包的。
不要从不靠谱的方向找解决方案。 ...

这样的话没有方法解决了么,若是要保证数据结构不被破坏只能采用UDP传输方式了么?

出0入0汤圆

发表于 2014-3-21 20:26:05 | 显示全部楼层
给每个包定义一个包头,也就是自己设定一个协议,这样接收端收到粘包之后,就可以用指定的协议拆分这个包了。

出0入0汤圆

发表于 2015-3-23 16:29:12 | 显示全部楼层
拆包粘包很正常的啦,你要加自己的协议如帧头帧尾,来做解析的。

出0入0汤圆

发表于 2015-4-1 16:38:08 | 显示全部楼层
关注。。。。。。

出0入0汤圆

发表于 2015-4-11 15:29:18 | 显示全部楼层
在包头加个长度就可以了。或者自己定义包结束标志

出0入0汤圆

发表于 2015-4-11 20:15:04 | 显示全部楼层
TCP的粘包是需要自己处理的,跟Negal算法没有关系,定好协议,比如先传长度,再按照长度收取数据。

出0入0汤圆

发表于 2015-5-28 22:22:42 | 显示全部楼层
同意楼主说法,一般的自定义协议都这么搞的

出0入0汤圆

发表于 2015-5-28 22:31:43 | 显示全部楼层
关注,我准备使用rtthread试试

出0入31汤圆

发表于 2015-6-15 20:30:38 来自手机 | 显示全部楼层
是不是很小的包都有可能分拆?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 00:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表