我正在使用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的操作类似。
答案 0 :(得分:2)
我会这样尝试:QHttpMultiPart
使用QHttpPart
个元素作为数据块。并且QHttpPart
有QHttpPart::setBodyDevice( QIODevice * device )
来设置其数据提供者。创建自己的QIODevice
提供程序并控制其中的数据带宽。
修改强>
QNetworkAccessManager
的更一般解决方案是为QIODevice
提供QNetworkAccessManager::post( const QNetworkRequest & request, QIODevice * data )
并控制其中的带宽。
答案 1 :(得分:0)
虽然不是这个问题的100%解决方案(它没有使用Qt而且一般不限制应用程序的带宽,所以我赢了&#t; t&#34;接受&#34;这个),这是我们最终实施的解决方法:
使用
的类
libcurl
我们正在使用该类而不是QNetworkAccessManager,无论我们需要在哪里进行速度限制的上传/下载。
使用OpenSSL支持构建libcurl,然后您可以非常轻松地使用CURLOPT_MAX_SEND_SPEED_LARGE参数来设置上传速度限制。