你如何限制C中套接字连接的带宽?

时间:2008-10-25 01:54:16

标签: c++ c sockets network-programming

我正在使用BSD套接字编写客户端 - 服务器应用程序。它需要在后台运行,不断传输数据,但不能从正常使用中占用网络接口的带宽。根据接口的速度,我需要将此连接限制为某个最大传输速率。

以编程方式实现此目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:17)

每次传输后睡眠持续1秒的问题是您的网络性能会有不稳定。

让BandwidthMaxThreshold成为所需的带宽阈值。

让TransferRate成为连接的当前传输速率。

则...

如果您检测到TransferRate> BandwidthMaxThreshold然后你做一个SleepTime = 1 + SleepTime * 1.02(将睡眠时间增加2%)

在每个网络操作之前​​或之后做一个 睡眠(睡眠时间)

如果您检测到TransferRate比BandwidthMaxThreshold低很多,则可以减少SleepTime。或者,您可以随时间衰减/减少SleepTime。最终您的SleepTime将再次达到0。

而不是增加2%,你也可以线性增加TransferRate - BandwidthMaxThreshold之间的差值。

此解决方案很好,因为如果用户的网络已经没有您想要的那么高,您将无法入睡。

答案 1 :(得分:12)

最好的方法是使用token bucket

仅当您有足够的令牌来填充数据包时传输(1460个字节将是一个很好的数量),或者如果您是接收方,只有当您有足够的令牌时才从套接字读取;一些简单的数学会告诉你在你有足够的令牌之前你需要等多久,所以你可以睡这么多时间(小心计算你实际获得了多少令牌 睡觉,因为大多数操作系统都可以比你要求的时间更长时间地睡眠。

要控制突发的大小,请限制您可以拥有的最大令牌数量;好的数量可能是一秒钟的代币。

答案 2 :(得分:7)

我和trickle好运。这很酷,因为它可以在不进行修改的情况下限制任意用户空间应用程序。它的工作原理是预加载自己的send / recv包装函数,为你进行带宽计算。

我发现的最大缺点是很难协调您想要共享有限带宽的多个应用程序。 “涓涓细流”有所帮助,但我发现它很复杂。

2017年更新:看起来涓涓细流已移至https://github.com/mariusae/trickle