5

重複の可能性:
Cのソケット接続の帯域幅をどのように抑制しますか?

Unix環境用のCで単純なFTPサーバーを作成しています。サーバーの機能として、ユーザーのアップロード/ダウンロード速度を制限したいと思います。

  1. この問題を直接解決するライブラリ関数はありますか?

  2. そうでない場合、本番FTPサーバーで使用されるアルゴリズムは何ですか?私には非常に素朴な解決策があります。1秒間に送信するバイト数を計算します。たとえばx、、、write(x)またはread(x)sleep(1)

より良い解決策があるはずです。コードサンプルがあればさらに良いです。

明確にするために、私はMac OS Xを使用していますが、Ubuntuまたは一部のLinuxでも実行できることを望みます。

4

2 に答える 2

0

FTPはアプリケーション層プロトコルです。FTPはTCPまたはUDPソケットで実行できます。(編集:tftpとuftpはudpで実行されます。詳細については、コメントセクションを参照してください)

ソケット速度は次の関数です:

  1. リンク速度:10/100ベース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

于 2012-05-17T01:18:55.700 に答える
-1

これを実行してもよろしいですか?ユーザーを困らせる動機はありますか?(これは正当な動機です-いくつかの「無料アップロード」サイトのいずれかを参照してください)

このような帯域幅制限は、サーバーを過負荷から保護するための良い方法ではありません。人々はスレッド化されたクライアントを見つけ、同時FTPセッションを開きます...

それを行うためのライブラリ関数はありますか?

おそらくそうではありませんが、帯域幅シェーピングはサービスタスクではなくOSタスクです。

アルゴリズムは何ですか?

あなたが説明するものはかなり効果的に聞こえます。

それをより良くするために、何オクテットが読み書きされたか、そして眠ることを決定する前にどれだけの時間が費やされたかを見ることができます。クライアントが制限よりも遅い場合を考えてみましょう。読み取りと書き込みがブロックされてしまい、sleep()によって不要なレイテンシが追加されるだけです。これにより、ユーザーからのディスク遅延などの非表示効果も減少します。

より細かい解像度のためにusleepまたはnanosleepを使用することを検討できます。どちらもposixにあるため、OSX*BSDおよびLinuxで使用する必要があります。

于 2012-05-17T01:09:49.017 に答える