Linux / Windows的什么API对应于限制networking(下载/上传)的速度?

我正在谈论下载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上, pollselect系统调用可以等待一些延迟,直到输入或输出可用。 等待,使用usleepnanosleep系统调用等。