可能重复:
你如何扼杀在C插座连接的带宽?
我正在写在C简单的FTP服务器的Unix环境。 由于服务器的功能,我想限制用户的上传/下载速度。
是否有任何的库函数直接解决这个问题?
如果没有,什么是在生产FTP服务器所使用的算法? 我有一个很天真的解决方案:计算有多少字节在第二派,说x
, write(x)
或read(x)
然后sleep(1)
应该有一个更好的解决方案。 即使有代码示例更好。
需要明确的是,我使用的是Mac OS X,但我希望它也可能Ubuntu或者一些Linux下运行。
你确定你要这么做吗? 是你的动机惹恼你的用户? (这是一个合理的动机 - 看不到任何的几个“自由上传”网站)
带宽限制这样是不是为了保护你的服务器过载的好方法。 人们会发现线程客户端和开放并发FTP会话...
是否有任何库函数来做到这一点?
或许不会,带宽整形是一个操作系统的任务不是一个服务任务。
什么是算法?
您所描述的一个听起来很有效。
为了使其更好地可以看看有多少字节已读或写多少时间,决定在睡觉前已经用了。 考虑这样的客户端是不是你的极限速度较慢的情况:在读取和写入最终会阻塞和你的睡眠()只会增加不必要的等待时间。 这也将减少从用户的磁盘延迟等的隐藏效果。
你可以考虑使用usleep或了nanosleep了更高精度的都是在POSIX所以应该是OSX * BSD和Linux操作系统。
FTP是一应用层协议。 FTP可在TCP或UDP套接字运行。 (编辑:TFTP和UFTP在UDP上运行,请详见注释部分)
插座速度是以下几个因素:
- 链接速度:10/100碱基T等。
- 比特误码率(通常在当今世界的普遍低10到电源-9或诸如此类的事有突发错误以及:链路的BER。
- 套接字缓冲区大小:
/proc/sys/net/core
参数
在Linux上:在这里处理TCP套接字是一个很好的文章[1]
4.Tweak堆栈来过滤/丢弃分组引进分组丢失,从而最终节流流量:像netem工具[2]帮助您调整水桶节流流。
[1] http://www.cyberciti.biz/faq/linux-tcp-tuning/
[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem