5

可能重复:
如何在 C 中限制套接字连接的带宽?

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

  1. 有没有直接解决这个问题的库函数?

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

应该有更好的解决方案。如果有代码示例就更好了。

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

4

2 回答 2

0

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

套接字速度是以下函数:

  1. 链接速度:10/100 Base T 等等。
  2. 链路的误码率:误码率(通常在当今世界,它通常低 10 次方 -9 或类似的东西。也有突发错误。
  3. 套接字缓冲区大小:/proc/sys/net/core参数

在 linux 上:为了处理 TCP 套接字,这里有一篇很好的文章 [1]

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

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

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

于 2012-05-17T01:18:55.700 回答
-1

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

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

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

可能不是,带宽整形是一项操作系统任务而不是服务任务。

算法是什么?

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

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

您可以考虑使用 usleep 或 nanosleep 以获得更精细的分辨率,两者都在 posix 中,因此应该在 OSX *BSD 和 linux 上。

于 2012-05-17T01:09:49.017 回答