原文地址::https://blog.csdn.net/bsbsxll/article/details/40824755
相关文章
1、QT中UDPSocket丢包问题—-https://blog.csdn.net/rabbitjerry/article/details/72674458
2、QT中UDPSocket丢包问题(续)—-https://blog.csdn.net/rabbitjerry/article/details/72830004
3、UDP主要丢包原因及具体问题分析—-https://blog.csdn.net/kobejayandy/article/details/35797609
4、解决UDP丢包问题的经验—-https://blog.csdn.net/kristpan/article/details/50553592
5、Linux 络编程-UDP接收数据丢包解决方案—-https://blog.csdn.net/baidu_35692628/article/details/76165337
6、Linux UDP严重丢包问题的解决—-https://blog.csdn.net/u013267687/article/details/52594126
最近烦人的事情很多,所以博客一直被落下了。这样不好,希望可以敦促自己不要懒惰。
前些日子接下了一个撂摊子的项目,这个项目中大量的使用udp socket进行多软件多硬件的来回通讯过程,但说实话通信量不是特别大。但是经常遇到各种各样奇怪的丢包现象。在解决这些问题过程中,也算加强了一些基础知识的学习,在此也顺便记录下解决步骤,以便下次项目中使用。
该项目中软件部分有A、B两个软件。其中A和B都有各自的发送和接受UDP功能。
代码实现很简单:
发送端:
接收端:
以上是原程序。
刚开始测试的时候,另一程序以每500ms速度发送长度为512长度的 文,发现丢包现象比较严重。开始怀疑是否是因为收包程序while中有大量的逻辑判断逻辑而造成 文并没有及时的接受到。于是新建一个数据缓存池CDataPool类,并继承于Qthread类。接受到 文后,不进行任何处理,直接放至CDataPool类的队列中,然后另起线程进行 文解析操作,代码如下:
CDataPool.h
CDataPool.cpp
CDataPool 是一个单例,同时使用线程在不停的执行 文解析,当有新的 文进来后,唤醒线程,否则线程休眠。
然后修改原来的接受部分程序:
改完以上的程序后,我满心以为,应该不会丢包了吧用100ms的发送次数,依然丢包,只是稍微好了一点点。但至少有些进步。大概1000包数据中至少会丢400包。伤心。
通过上述的实践说明,在 文接受过程中, 文解析逻辑比较复杂时,如果在同一线程处理,会对造成一定程度的丢包现象。但绝不是主要原因。
客户几个电话打过来催促解决问题的时间点。无奈继续没有注释阅读代码,突然发现了一个比较有趣的逻辑,很值得分享下。大家都知道到udp 文大于一定值时,将会被截包或者丢包。之前写这个项目的人写了以下的代码:
上面的代码主要是将要发送的 文拼接成字符串时,按照1000的长度进行分割,分割完毕后在发送到socket中。想法是好的,但是问题就来了,他在一个for循环中发送 文,这个速度可不是100ms或者其他值,可能都是微秒级别的。
我很想将上面的代码改动下,但是发现几乎所有的类全部都关联这个里面,改动实在太大,所以我使用了一个临时解决方法在foreach循环中加上Sleep(100).
这个操作完成后,惊喜很大,在发送频率为150ms的时候,就从没有出现丢包现象,但是如果设置成100ms,基本还是会丢10包左右。
这篇文章应该没有什么技术含量,但是却记录着一些解决问题的方法和思路,希望可以互相共享并且请大牛们指点不足。谢谢
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!