如何限制应用程序的上传速度?

时间:2017-07-04 13:03:09

标签: c++ windows qt winapi

我正在使用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流量控制,但这只能用于限制完整的网络接口或检查数据包,而不是特定的应用程序。此外,这几乎没有例子,只是一些古老的代码片段。不完全是我想要的...

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

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

2 个答案:

答案 0 :(得分:2)

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

修改 QNetworkAccessManager的更一般解决方案是为QIODevice提供QNetworkAccessManager::post( const QNetworkRequest & request, QIODevice * data )并控制其中的带宽。

另见this proposed solution

答案 1 :(得分:0)

虽然不是这个问题的100%解决方案(它没有使用Qt而且一般不限制应用程序的带宽,所以我赢了&#t; t&#34;接受&#34;这个),这是我们最终实施的解决方法:

使用
的类 libcurl

我们正在使用该类而不是QNetworkAccessManager,无论我们需要在哪里进行速度限制的上传/下载。

使用OpenSSL支持构建libcurl,然后您可以非常轻松地使用CURLOPT_MAX_SEND_SPEED_LARGE参数来设置上传速度限制。