tyj07 发表于 2014-3-21 12:01:09

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

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

aozima 发表于 2014-3-21 13:35:12

TCP是流式的。建议先看看基础书。

tyj07 发表于 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)大小的缓冲区内存好像没有什么作用,接收数据块的大小依然会变动。没有一次接收发送大小数据的方法么?
还有种解决方法就是封包,拆包的方法,我正在尝试。

aozima 发表于 2014-3-21 14:31:33

即使收发双方处理了,中间的N级路由也可能会拆封包的。
不要从不靠谱的方向找解决方案。

tyj07 发表于 2014-3-21 14:35:54

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

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

飞剑 发表于 2014-3-21 20:26:05

给每个包定义一个包头,也就是自己设定一个协议,这样接收端收到粘包之后,就可以用指定的协议拆分这个包了。

tigerman520 发表于 2015-3-23 16:29:12

拆包粘包很正常的啦,你要加自己的协议如帧头帧尾,来做解析的。

zero_ 发表于 2015-4-1 16:38:08

关注。。。。。。

pangweishen 发表于 2015-4-11 15:29:18

在包头加个长度就可以了。或者自己定义包结束标志

farmerzhangdl 发表于 2015-4-11 20:15:04

TCP的粘包是需要自己处理的,跟Negal算法没有关系,定好协议,比如先传长度,再按照长度收取数据。

lpdpzc 发表于 2015-5-28 22:22:42

同意楼主说法,一般的自定义协议都这么搞的

jeasey 发表于 2015-5-28 22:31:43

关注,我准备使用rtthread试试

zchong 发表于 2015-6-15 20:30:38

是不是很小的包都有可能分拆?
页: [1]
查看完整版本: rt-thread+lwip tcp接收数据粘包的问题