【问题标题】:bandwidth throttling with QtQt 带宽限制
【发布时间】:2009-04-08 12:45:57
【问题描述】:

我正在使用 QNetworkAccessManager 从 Web 下载文件,它为任务提供了一个简单的 API。但我希望为类添加下载速率限制,因此所有 http 回复都不会超过该限制(我认为没有理由限制请求)。

我用谷歌搜索了一下,发现了一篇有趣的帖子here。但它所做的是 QTcpSocket 的子类,并使用管理一组套接字的单独类来控制带宽。虽然这很好,但我想继续使用 QNetworkAcessManager 类。

我认为我可以:

  1. 子类 QNetworkAccessManager 并以某种方式集成子类 QTcpSocket(这可能涉及子类化更多类,QHttp* 类)。
  2. 使用文章中提供的类并围绕这些类构建我自己的 QNetworkAccessManager。
  3. QNetworkAccessManager 允许使用代理。我可以编写一个虚假的代理类,其中包含带宽限制逻辑。但这对我来说似乎是一个丑陋的 hack。

虽然前 2 个选项是可能的,但我想知道是否有更简单的方法可以做到这一点?如果不是,你会推荐哪一个?

【问题讨论】:

    标签: c++ qt bandwidth


    【解决方案1】:

    我最终使用了来自this article 的 RcTcpSocket 和 RateController 以及 QHttp 类。在使用 QHttp 发出 get/post 请求之前,我创建了一个 RcTcpSocket,将它添加到我的 RateController 并使用 QHttp::setSocket(QTcpSocket*)。我仍然没有找到继续使用 QNetworkAccessManager 的解决方案,但这已经足够接近并且效果很好。

    【讨论】:

    • 链接不再有用。
    【解决方案2】:

    你应该看看 QNetworkReply::setReadBufferSize(qint64 size)。我引用文档:

    一旦此缓冲区已满(即 bytesAvailable() 返回大小或更多),QNetworkReply 将尝试停止从网络读取,从而导致 下载速度下降。如果缓冲区的大小不受限制,QNetworkReply 将尝试尽可能快地从网络下载。

    我猜你可以使用这个值,也许你从 downloadProgress() 信号中得到的值可以减慢速度。我认为它应该很难得到精确的东西,但它可能是可行的。

    【讨论】:

    • 显然你不明白为什么要进行“带宽限制”。需要将某些服务优先于其他服务并让所有服务正常运行(防止饥饿)。引用的文档无助于解决此类问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2011-08-09
    相关资源
    最近更新 更多