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:} TCP是流式的。建议先看看基础书。 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)大小的缓冲区内存好像没有什么作用,接收数据块的大小依然会变动。没有一次接收发送大小数据的方法么?
还有种解决方法就是封包,拆包的方法,我正在尝试。 即使收发双方处理了,中间的N级路由也可能会拆封包的。
不要从不靠谱的方向找解决方案。 aozima 发表于 2014-3-21 14:31
即使收发双方处理了,中间的N级路由也可能会拆封包的。
不要从不靠谱的方向找解决方案。 ...
这样的话没有方法解决了么,若是要保证数据结构不被破坏只能采用UDP传输方式了么? 给每个包定义一个包头,也就是自己设定一个协议,这样接收端收到粘包之后,就可以用指定的协议拆分这个包了。 拆包粘包很正常的啦,你要加自己的协议如帧头帧尾,来做解析的。 关注。。。。。。 在包头加个长度就可以了。或者自己定义包结束标志 TCP的粘包是需要自己处理的,跟Negal算法没有关系,定好协议,比如先传长度,再按照长度收取数据。 同意楼主说法,一般的自定义协议都这么搞的 关注,我准备使用rtthread试试 是不是很小的包都有可能分拆?
页:
[1]