关于UDP接收数据:使用boost asio库和使用Qt网络库的比较

Qt 同时被 2 个专栏收录
20 篇文章 0 订阅
2 篇文章 0 订阅

使用boost asio库和使用Qt网络库进行UDP数据接收

前面的话

  之前在进行网络编程时使用的比较多的是Qt的网络库,大部分会使用UDP协议进行传输,刚开始时对性能的要求不高,1s内也就接收50次左右,所以使用时没有出现什么异常。最近做的项目要求达到1s内500次以上的接收频次,此时使用Qt的QUdpSocket进行接收时发现接收过程中会存在大量的丢包现象,刚开始时以为这是UDP传输的正常现象,后来经前辈指点,发现其实UDP的接收有缓存一说,当数据传输过快,接收缓存不够时就会舍弃一些数据出现丢包现象。于是查了Qt的官方文档,在void QAbstractSocket::setReadBufferSize(qint64 size)下找到了下面的一段说明:

Only QTcpSocket uses QAbstractSocket's internal buffer; QUdpSocket does not use any 
buffering at all, but rather relies on the implicit buffering provided by the 
operating system. Because of this, calling this function on QUdpSocket has no effect.

  所以在Qt上的UDP接收缓存其实是依赖操作系统的,后来查了一下,发现已经设置成了最大的65535,由于每个数据包的大小基本在255字节左右,这时出现丢包也就不奇怪了。

Boost Asio

  之前接触Boost不多,只知道有个网络库Asio,所以想试下。我使用的是同步编程,使用的是receive_from,刚开始时没有设置缓冲区,发现接收时同样会出现丢包现象,之后将缓冲区的大小设置的比较大了之后数据丢包的现象就没有发生过了,设置缓冲区大小的代码如下:

m_udpSocket->set_option( socket_base::receive_buffer_size(1024*1024*50) );

总结

  Qt的UdpSocket数据接收机制可能只适用于一般的传输,对于较高并发数的传输时会出现丢包等现象,所以在对传输效率和数据安全性要求较高的地方还是考虑自己写接收程序或者使用Asio库。后面还会对Asio做进一步的学习和研究,以上算是记录一下解决问题的过程吧,之前编程太依赖Qt的库,后面还是多接触一点其他优秀的开源库吧。

  • 1
    点赞
  • 0
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值