Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C语言中,如何限制套接字连接的带宽?_C++_C_Sockets_Network Programming - Fatal编程技术网

C++ 在C语言中,如何限制套接字连接的带宽?

C++ 在C语言中,如何限制套接字连接的带宽?,c++,c,sockets,network-programming,C++,C,Sockets,Network Programming,我正在使用BSD套接字编写客户端服务器应用程序。它需要在后台运行,不断传输数据,但不能占用正常使用的网络接口带宽。根据接口的速度,我需要将此连接限制到某个最大传输速率 以编程方式实现这一点的最佳方法是什么?每次传输后保持1秒恒定睡眠的问题是,网络性能会出现波动 让BandwidthMaxThreshold为所需的带宽阈值 TransferRate是连接的当前传输速率 然后 如果检测到传输速率>带宽MaxThreshold,则执行睡眠时间=1+睡眠时间*1.02(将睡眠时间增加2%) 在每次网络操

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


以编程方式实现这一点的最佳方法是什么?

每次传输后保持1秒恒定睡眠的问题是,网络性能会出现波动

让BandwidthMaxThreshold为所需的带宽阈值

TransferRate是连接的当前传输速率

然后

如果检测到传输速率>带宽MaxThreshold,则执行睡眠时间=1+睡眠时间*1.02(将睡眠时间增加2%)

在每次网络操作之前或之后执行以下操作: 睡眠(睡眠时间)

如果你检测到你的传输速率比你的带宽MaxThreshold低很多,你可以减少你的睡眠时间。或者,你可以随着时间的推移,减少你的睡眠时间。最终你的睡眠时间将再次达到0

除了增加2%之外,您还可以增加传输速率-带宽MaxThreshold之间的较大线性差异

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

我和他交了好运。它很酷,因为它可以在不修改的情况下限制任意用户空间应用程序。它通过预加载自己的send/recv包装函数来工作,这些函数为您计算带宽

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


2017年的更新:看起来涓流已经转移到了

最好的方法是使用

仅当您有足够的令牌来填充数据包时(1460字节将是一个不错的数量),或者如果您是接收端,则仅当您有足够的令牌时才从套接字读取;一点简单的数学知识会告诉你在拥有足够的令牌之前需要等待多长时间,这样你就可以睡眠那么长的时间(请小心计算你实际睡眠的时间获得了多少令牌,因为大多数操作系统可以让进程睡眠的时间比你要求的时间更长)


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

@Brian:为什么需要“1+”呢?SleepTime=1.02*SleepTime本身是否会将该值增加2%?我刚刚添加了它,以便如果您的睡眠时间达到0,它将能够再次增加。如果协议使用确认,则接收响应之前的延迟也可用于提供端到端的管道延迟,并建议传输消息的速率。这将提供一个自适应解决方案,允许在多个安装中进行自调整。将套接字接收缓冲区大小设置为所需的带宽延迟乘积。