当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你如何限制C中套接字连接的带宽?》经验,为你挑选了3个好方法。

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

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



1> Brian R. Bon..:

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

设BandwidthMaxThreshold是所需的带宽阈值.

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

然后...

如果检测到TransferRate> BandwidthMaxThreshold,则执行SleepTime = 1 + SleepTime*1.02(将睡眠时间增加2%)

在每次网络操作之前​​或之后进行睡眠(睡眠时间)

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

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

这个解决方案很好,因为如果用户的网络已经没有你想要的那么高,你将没有睡眠.


我刚添加它,以便如果你的SleepTime达到0,它将能够再次增长.此外,当它必须增长时,它总是会增长至少1.

2> CesarB..:

最好的方法是使用令牌桶.

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

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



3> Chris Dolan..:

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

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

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

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有