如何限制C中的套接字速度?

时间:2012-05-17 00:27:34

标签: c performance sockets ftp bandwidth-throttling

  

可能重复:
  How do you throttle the bandwidth of a socket connection in C?

我正在用C语言为Unix环境编写一个简单的FTP服务器。作为服务器的一项功能,我想限制用户的上传/下载速度。

  1. 是否有任何库函数直接解决了这个问题?

  2. 如果没有,生产FTP服务器中使用的算法是什么?我有一个非常天真的解决方案:计算一秒钟发送的字节数,比如说xwrite(x)read(x),然后是sleep(1)

  3. 应该有更好的解决方案。如果有代码样本,那就更好了。

    要说清楚,我使用的是Mac OS X,但我希望它也可以在Ubuntu或某些Linux下运行。

2 个答案:

答案 0 :(得分:0)

你确定要这么做吗? 你的动机是惹恼你的用户吗? (这是一个合法的动机 - 看看几个“免费上传”网站中的任何一个)

这样的带宽限制不是保护服务器免于过载的好方法。 人们会找到线程客户端并打开并发FTP会话...

是否有任何库函数可以做到这一点?

可能不是,带宽整形是OS任务而不是服务任务。

算法是什么?

你描述的那个听起来相当有效。

为了使它更好,可以查看已经读取或写入了多少个八位字节以及在决定睡眠之前花了多少时间。考虑客户端慢于限制的情况:读取和写入将最终阻塞,而sleep()将仅添加不必要的延迟。这也将减少用户对磁盘延迟等的隐藏影响。

你可以考虑使用usleep或nanosleep来获得更好的分辨率 两者都在posix中,所以应该在OSX * BSD和linux上。

答案 1 :(得分:0)

FTP是一种应用层协议。 FTP可以在TCP或UDP套接字上运行。 (编辑:tftp和uftp在udp上运行,请参阅评论部分了解详情)

套接字速度是以下功能:

  1. 链接速度:10/100 Base T等等。
  2. 链路的BER:比特错误率(通常在今天的世界中它通常低至10的功率-9或类似的东西。也有突发错误。
  3. 套接字缓冲区大小:/proc/sys/net/core参数
  4. 在linux上:对于处理TCP套接字,这是一篇很好的文章[1]

    4.清除堆栈以过滤/丢弃数据包以引入数据包丢失,从而最终限制流量:像 netem [2]这样的工具可帮助您调整存储桶以限制流量。

    [1] http://www.cyberciti.biz/faq/linux-tcp-tuning/

    [2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem