【问题标题】:How do I limit socket speed in C? [duplicate]如何限制 C 中的套接字速度? [复制]
【发布时间】:2012-05-24 14:26:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • “作为服务器的一项功能,我想限制用户的上传/下载速度” - 这听起来是个很棒的功能
  • 这个问题可能会有所帮助 - stackoverflow.com/questions/235762/…
  • @skjaidev 我正在使用 Mac OS X,但我希望它也可以在 Ubuntu 或其他东西下运行
  • 啊啊啊啊!!!不要做“睡眠(1)”。 不要做“睡眠(1)”! ;) 查看您的操作系统在 QoS 和限制功能方面提供了什么(您没有提及您正在运行的操作系统)。
  • 你可能还想看看“tcpnice”:cs.utexas.edu/users/dahlin/software/2002-nice.html

标签: c performance sockets ftp bandwidth-throttling


【解决方案1】:

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

套接字速度是以下函数:

  1. 链接速度:10/100 Base T 等等。
  2. 链接的 BER:误码率(在当今世界通常为低 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

【讨论】:

  • “FTP 可以在 UDP 套接字上运行”...这种说法需要证据。
  • 为了避免从离题到 FTP 的讨论,我没有提供详细信息。 1. tftp 在 udp 端口​​ 69 上运行以提高速度。 2. uftp 是一种多播文件传输,为安全提供加密。
  • TFTP 传输文件,但它不是 FTP。同上 uftp。
  • 它们是文件传输应用层协议。当然,变体有其个性。 !!!!
  • FTP 在 UDP 上运行的说法仍然是错误的。
【解决方案2】:

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

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

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

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

算法是什么?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2018-06-12
    • 2011-05-08
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多