【发布时间】: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 请求可以发生很多次。但同时只有一次。