udp传输到底会不会发生粘包问题
看了一些解答说udp都是整包发,整包收,不会发生粘包,但是周围的前辈们说还是有可能的,我们现在服务端收到的数据也就几十个字节的大小,收的频率是每秒10条左右吧,到底会不会发生粘包现象,就是两条数据粘一块,或者其中一条数据不完整另一个完整
下面这个是具体代码,第一个是定义数据包的,第二个是判断粘包的
现在程序应该怎么优化?
1.既然粘包概率极低,可不可以直接判断包的大小,过大直接把这包甩了不要?
2.还是对下面的粘包算法进行优化?
给个思路吧 ,感谢各位!!
#define PACKAGE_LEN 1024
typedef struct _Package
{
char chData[PACKAGE_LEN];
int nLen;
SOCKADDR_IN addr;
}Package;
UDP 粘包 性能优化
int nAnalysed = 0;
do
{
nAnalysed = m_DataAnalysis.AnalyseDevice( pack.chData, pack.addr );
pack.nLen -= nAnalysed;
if( pack.nLen > 0 )
{
::memmove( pack.chData, pack.chData + nAnalysed, PACKAGE_LEN - nAnalysed );
}
else if( pack.nLen < 0 )
{
TRACE(_T("\n处理设备的数据比收到的数据多!"));
}
}while( pack.nLen > 0 );
[解决办法]
udp加数据包协议
http://bbs.csdn.net/topics/360240000
[解决办法]
楼主可以参考文章:Socket/TCP粘包、多包和少包, 断包
[解决办法]
从TCP与UDP的区别讲起
网络数据经过路由器,如果数据很小,没有超过路由器的封包大小,就会直接直接经过路由器到达下一个路由器,一层一层最终到达目的地
如果数据很大,这里指一个发送,超过了路由器的封包大小,那么路由器就会把这个数据包进行拆分,比如拆分成A B C三个包,这三个包都没有超过路由器的封包大小,到达下一个路由器的时候,TCP与UDP的区别就来了:
TCP收到A的时候,会resp通知源路由器,A到达,B C包依然如此,如果由于网络的各种原因,目的路由收到了A C,B没有收到,TCP会要求源路由把B包重新发一次,直到ABC包目的路由都接受到了,那么目的路由把ABC包重新组成起始包,继续往下一个路由发送,这就是TCP安全连接的由来,只要发送,我就能保证目的一定能收到(网络断开能检测到)
UDP则不是这样,如果ABC包拆分之后,目的路由只收到AC,经过检测,B没有被收到,那么此包就会被当作不完整,直接被丢弃。由于UDP没有resp的通知过程,所以,UDP的传输效率要高一些,当然安全性也低一些
由上面的这些可以得出结论:UDP是绝对不会被粘包,因为路由器收到的只会是完整数据才会继续下发,什么粘包处理完全没有必要
[解决办法]
UDP有明确的结束标志,不会有粘包的,UDP本身有对数据完整性的校验,不完整的包会被丢弃,所以也不会不完整。如果你是指一次会受到2-3个UDP包,那只要根据开头和结束标记分割就行了。TCP的话,只要所需数据块的大小是确定的,然后每次接受的数据根据长度,不足就继续收,超过就把剩余的存下来与下次的接受合并,就可以解决粘包问题。
------解决方案--------------------
粘包这个词应该是特指TCP的,是你一次发的数据太少,不值得发一次,系统就把他缓冲下来,和下次的一起发了。这是因为TCP传输本来就是流的概念,程序处理的是流,怎么分包程序都应该能正确处理。多数情况下TCP也不需要处理粘包。
UDP没有粘包,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包
[解决办法]
不会粘包,但会丢包
[解决办法]
UDP不是流协议,有消息边界,不存在粘包的问题。要丢就是整个包都丢了。