我正在谈论下载pipe理器的速度限制。 例如,在Internet Download Manager中有一个选项:
它如何限制速度? 我的意思是,是否有某种Windows API的呢? 如果它是一个Linux应用程序呢?
有几种方法可以在Windows中完成:
应用程序本身可以通过监视它自己的比特率来隐式地限制下载速度,并根据需要在套接字之间的recv()
或read()
调用之间进行休眠。
我怀疑Internet Download Manager可能将自己安装为本地HTTP代理,并将浏览器配置为通过它路由所有请求。 然后使用自己的网络代码,使用我上面描述的简单技术,以适当的速率流式传输下载。 看看是否有一个为你的浏览器配置的http代理 – 这应该是一个很好的提示,如果这是它在做什么。
另一种技术是使用Winsock分层服务提供程序或筛选器驱动程序。 尝试从命令行输入netsh winsock show catalog
(已经安装了很多系统)。
而Winsock本身就有一个旧的QOS API ,可以在特定的套接字上进行“流量整形”。 (如果内存服务,它甚至有一些系统策略支持,可以在应用程序外部进行配置)。
我真的需要这个在Linux上做的项目。 我注意到,传输有限制下载速度的能力。 通过源代码窥视,你可以发现卷曲。
这就是说,libcurl似乎是C \ C ++程序的一个很好的API。 api看起来不错,文档也没有。
请参阅CURLOPT_MAX_SEND_SPEED_LARGE和CURLOPT_MAX_RECV_SPEED_LARGE:
man curl_easy_setopt(3)
和libcurl主页
@ selbie指着你正确的方向。 我只想详细说明:
收件人只能控制大量下载的速度。 对于非常小的下载,TCP慢启动将控制带宽。 由于TCP流控制取决于ACK,并且发送方不会等待任何ACK,所以不会像完全一样小的下载(达到协商的TCP窗口大小限制)将以连接允许的速度完成。 对于中等大小的下载(直至套接字缓冲区大小),操作系统将立即确认数据包,这些数据将尽可能快地完成连接,并且应用程序无法控制。 只有套接字缓冲区填满后,应用程序才能延迟recv
并导致背压,从而限制了传输速率。 网络堆栈(QOS或过滤器驱动程序)内的解决方案需要较短的传输。
如果协议提供了一种方法来要求发送者设置传输速度,那将是最有效的。
在Linux上,我不知道它是如何实际完成的,但是您可以始终查看执行此操作的应用程序的源代码(例如wget
with --limit-rate
),或者直接了解所涉及的系统调用。
如果我不得不在网络应用程序中编写一个带宽限制,那么在每个缓冲区传输之后,我会简单地这样做:我将计算当前的带宽,并等待(不发送)合适的延迟以避免溢出限制。
在Linux上, poll
和select
系统调用可以等待一些延迟,直到输入或输出可用。 等待,使用usleep
或nanosleep
系统调用等。