Linux / Windows的哪些API对应限制网络(下载/上传)速度?

时间:2011-11-03 19:27:28

标签: windows linux winapi

我在谈论下载管理器的速度限制。例如,在Internet Download Manager中有一个选项:

enter image description here

它如何限制速度?我的意思是,是否有某种Windows API?如果它是一个Linux应用程序怎么办?

4 个答案:

答案 0 :(得分:5)

在Windows中可以采用以下几种方法:

应用程序本身可以通过监视自己的比特率并根据需要在套接字上的recv()read()之间休眠来隐式限制下载速度。

我怀疑Internet Download Manager可能会将自己安装为本地HTTP代理,并将浏览器配置为通过它来路由所有请求。然后使用自己的网络代码,使用上面介绍的简单技术以适当的速率传输下载。看看是否为您的浏览器配置了一个http代理 - 这应该是一个很好的提示,如果这是它正在做的。

另一种技术是使用Winsock分层服务提供程序或筛选器驱动程序。尝试从命令行键入netsh winsock show catalog(已安装了许多系统)。

Winsock本身有一个旧的QOS API可以在特定套接字上进行“流量整形”。 (如果内存服务,它甚至有一些系统策略支持,可以在应用程序之外的外部进行配置)。

答案 1 :(得分:2)

我实际上需要这个用于Linux上的项目。我注意到传输能够限制下载速度。窥视它们的源代码,你可以找到它的卷曲。

据说,libcurl似乎是C \ C ++程序的一个很好的api。 api看起来并不那么糟糕,文档也没有。

请参阅CURLOPT_MAX_SEND_SPEED_LARGE和CURLOPT_MAX_RECV_SPEED_LARGE:

man curl_easy_setopt(3)

libcurl homepage

答案 2 :(得分:1)

@ selbie指出你正确的方向。我只想详细说明:

收件人实际上只能控制大量下载的速度。对于非常小的下载,TCP慢启动将控制带宽。不那么小的下载(直到协商的TCP窗口大小限制)将以连接允许的速度完成,因为TCP流控制依赖于ACK,并且发送方不会等待任何ACK。对于中等大小的下载(最多为套接字缓冲区大小),操作系统将立即确认该数据包,这些将在连接允许的情况下完成,并且应用程序无法控制。只有在套接字缓冲区填满后,应用程序才会延迟recv并导致限制传输速率的背压。更短的传输需要网络堆栈内的解决方案(QOS或过滤器驱动程序)。

如果协议提供了一种询问发送方设置传输速度的方法,那将是最有效的。

答案 3 :(得分:0)

在Linux上,我不知道它是如何实际完成的,但你总是可以查看执行此操作的应用程序的源代码(例如wget--limit-rate)或strace他们了解所涉及的系统调用。

如果我必须在网络应用程序中编码带宽限制,我会在每次缓冲区传输后执行此操作:我会计算当前带宽,并等待(不传输)合适的延迟以避免溢出限制。< / p>

在Linux上,pollselect系统调用可能会等待一段时间,直到输入或输出可用。要等待,请使用usleepnanosleep系统调用等