【问题标题】:How to limit the upload speed of an application?如何限制应用程序的上传速度?
【发布时间】:2017-07-04 13:03:09
【问题描述】:

我正在使用 QNetworkAccessManager 上传文件(和一些数据),如下所示:

QNetworkRequest request(<some URL>);
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
<multipart is filled with single parts>

networkAccessManager->post(request, multiPart);

效果很好。 但是,用户报告说上传会影响他们的上传带宽。这……当然是有道理的;)

现在,我想实现一些东西来限制这个帖子请求的上传速度。然而,在环顾了一会之后,我发现绝对没有任何简单的方法可以做到这一点。

QNetworkReply 有 setReadBufferSize,但写入没有等价物。不添加它似乎是一个明显的错误......

我找到了这个东西:http://doc.qt.io/qt-5/qtnetwork-torrent-example.html
并试图根据我的需要调整它的一些类。 但是,这一切都失败了,因为我只是找不到中断数据写入的方法(比平时慢)。该示例依赖于用户自己编写写入代码 - 但这在此处是不可能的,因为 Qt 在内部执行发布请求后的数据写入。

我也尝试使用 Windows API 流量控制,但它只能用于限制完整的网络接口或检查数据包,而不是特定的应用程序。另外,这几乎没有示例,只有一些古老的代码 sn-ps。不完全是我想要使用的......

有没有什么方法可以在不重写 Qt 源代码的情况下实现上传限制(我不会这样做)?
一种“全局”限制应用程序上传速度的方法也是可以接受的,使用 Windows API 代码或任何东西,真的,只要在代码中是可能的。

其他信息:
限制用户计算机的上传速度是可以接受的。它必须只限制特定的应用程序。类似于您可以使用 NetLimiter 执行的操作。

【问题讨论】:

  • 我想 NetLimiter 在低级别执行此操作,可能是通过安装驱动程序。你准备好这样做了吗?
  • POST 请求很多还是只有一个?根据答案,我们可能会尝试延迟限制下载速度的请求。
  • David:这听起来确实需要做很多工作(特别是因为我只需要它用于一个应用程序,我们自己的)。我认为如果真的这样,在 Qt 中使用定时套接字连接并手动完成所有 HTTP 工作实际上会更容易。也会做很多工作,但至少更简单;)@AlexanderVX 这个 POST 请求可以发生很多次。但同时只有一次。

标签: c++ windows qt winapi


【解决方案1】:

我会尝试这种方式:QHttpMultiPart 使用 QHttpPart 元素作为数据块。而QHttpPartQHttpPart::setBodyDevice( QIODevice * device ) 来设置它的数据提供者。创建您自己的QIODevice 提供程序并控制其中的数据带宽。

编辑: 对于QNetworkAccessManager,更通用的解决方案是为QNetworkAccessManager::post( const QNetworkRequest &amp; request, QIODevice * data ) 提供QIODevice 并控制那里的带宽。

另请参阅this proposed solution

【讨论】:

  • 这是一个有趣的想法,它可能会奏效。然而,由于这种方法花费了太长时间,我们在此期间只是实现了一个 libcurl,至少在我们需要的部分完全替换了 QT 的下载/上传功能。这意味着我目前无法真正测试这一点。此外,我不确定我是否应该接受这一点,因为它非常特定于 QHttpMultiPart,而我更多的是寻找通用(或至少是 QNetworkAccessManager)解决方案。也许根本没有解决方案。
【解决方案2】:

虽然这个问题不是 100% 的解决方案(它不使用 Qt 并且一般不限制应用程序的带宽,所以我不会“接受”这个),但这是我们最终实施的解决方法:

使用
libcurl的类

我们正在使用该类而不是 QNetworkAccessManager,只要我们需要有速度限制的上传/下载。

自己构建了支持OpenSSL的libcurl,然后你可以很容易地使用CURLOPT_MAX_SEND_SPEED_LARGE参数来设置上传速度限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2011-09-10
    • 2014-06-26
    • 2013-07-30
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多