如何在C中限制socket速度?

5

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

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

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

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

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

明确一下,我正在使用Mac OS X,但我希望它也能在Ubuntu或某些Linux上运行。


1
作为服务器的一个功能,我希望能够限制用户的上传/下载速度。听起来像是一个很棒的功能。 - Ed S.
1
这个问题可能会有所帮助 - https://dev59.com/yHVC5IYBdhLWcg3woCjN - NG.
@skjaidev 我正在使用 Mac OS X,但我希望它也可以在 Ubuntu 或其他操作系统下运行。 - can.
3
啊啊啊!!!不要执行“sleep(1)”指令。请千万不要执行“sleep(1)”指令!;) 请查看您的操作系统提供的QoS和限速功能(您没有提到正在使用哪个操作系统)。 - paulsm4
2
您可能还想看看 "tcpnice": http://www.cs.utexas.edu/users/dahlin/software/2002-nice.html - paulsm4
如果您在每个线程中处理多个FTP会话,使用sleep(1)将产生意想不到的副作用。 - Jeremy Friesner
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

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

是一个与网络仿真有关的 Linux 内核模块,它可以用于模拟各种网络条件,如延迟、丢包、带宽限制等。该模块可用于测试和评估网络应用程序的性能,并帮助开发人员更好地了解其应用程序在不同网络条件下的行为。


3
“FTP 可以在 UDP sockets 上运行”... 这个说法需要证据支持。 - Ben Voigt
1
为了避免讨论偏离FTP,我没有在那里提供细节。1. TFTP在UDP端口69上运行以获得速度。2. 还有一种多播文件传输工具UFTP,可提供加密功能以增强安全性。 - Jay D
1
TFTP传输文件,但它不是FTP。同样的,uftp也是如此。 - Ben Voigt
它们是文件传输应用层协议。当然,这些变体都有自己的独特性。!!!! - Jay D
2
FTP运行在UDP上的说法仍然是错误的。 - user207421

-1

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

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

有没有库函数可以做到这一点?

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

算法是什么?

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接