Qt 使用UDPSocket遇到的丢包问题

原文地址::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功能。

代码实现很简单:

发送端:

  1.  

 

接收端:

 

以上是原程序。

 

刚开始测试的时候,另一程序以每500ms速度发送长度为512长度的 文,发现丢包现象比较严重。开始怀疑是否是因为收包程序while中有大量的逻辑判断逻辑而造成 文并没有及时的接受到。于是新建一个数据缓存池CDataPool类,并继承于Qthread类。接受到 文后,不进行任何处理,直接放至CDataPool类的队列中,然后另起线程进行 文解析操作,代码如下:

CDataPool.h

 

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  

CDataPool.cpp

 

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  

 

CDataPool 是一个单例,同时使用线程在不停的执行 文解析,当有新的 文进来后,唤醒线程,否则线程休眠。

 

然后修改原来的接受部分程序:

 

 

改完以上的程序后,我满心以为,应该不会丢包了吧用100ms的发送次数,依然丢包,只是稍微好了一点点。但至少有些进步。大概1000包数据中至少会丢400包。伤心。

通过上述的实践说明,在 文接受过程中, 文解析逻辑比较复杂时,如果在同一线程处理,会对造成一定程度的丢包现象。但绝不是主要原因。

 

客户几个电话打过来催促解决问题的时间点。无奈继续没有注释阅读代码,突然发现了一个比较有趣的逻辑,很值得分享下。大家都知道到udp 文大于一定值时,将会被截包或者丢包。之前写这个项目的人写了以下的代码:

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  

 

上面的代码主要是将要发送的 文拼接成字符串时,按照1000的长度进行分割,分割完毕后在发送到socket中。想法是好的,但是问题就来了,他在一个for循环中发送 文,这个速度可不是100ms或者其他值,可能都是微秒级别的。

 

我很想将上面的代码改动下,但是发现几乎所有的类全部都关联这个里面,改动实在太大,所以我使用了一个临时解决方法在foreach循环中加上Sleep(100).

这个操作完成后,惊喜很大,在发送频率为150ms的时候,就从没有出现丢包现象,但是如果设置成100ms,基本还是会丢10包左右。

 

这篇文章应该没有什么技术含量,但是却记录着一些解决问题的方法和思路,希望可以互相共享并且请大牛们指点不足。谢谢

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年7月12日
下一篇 2018年7月12日

相关推荐