2012-05-17 13 views
5

可能性の重複:
How do you throttle the bandwidth of a socket connection in C?Cでソケット速度をどのように制限できますか?

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

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

  2. もしそうでなければ、プロダクションFTPサーバーで使用されるアルゴリズムは何ですか?私は非常に素朴なソリューションを持っています。つまり、何秒間に何バイトを送信するかを計算します。たとえば、xwrite(x)またはread(x)、次にsleep(1)です。

もっと良い解決策があります。コードサンプルがあればさらに優れています。

私はMac OS Xを使用していますが、UbuntuやLinuxでも動作したいと思っています。

+0

* "サーバーの特徴として、私は、ユーザーのアップロード/ダウンロード速度を制限したい" * - それは素晴らしい機能 –

+0

のように聞こえますあなたはどんなOSですか? – jman

+1

この質問は役に立ちましたか? - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

答えて

0

本当にやり直してよろしいですか? あなたの動機はユーザーを煩わせることですか? (これは正当な動機で、いくつかの「無料アップロード」サイトのいずれかを参照してください)

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

これを行うライブラリ関数はありますか?

帯域幅シェーピングは、サービスタスクではなくOSタスクです。

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

あなたが説明するものはかなり効果的です。

これを改善するために、読み書きされたオクテットの数と、スリープ状態になるまでにどれくらいの時間が費やされたかを調べることができます。クライアントがあなたの限界よりも遅い場合を考えてみましょう。読み取りと書き込みはブロックされ、sleep()は不必要な待ち時間を追加します。これはまた、ユーザからのディスク待ち時間等の隠蔽効果を低減する。

細かい解像度のためにusleepやnanosleepの使用を検討することができます OSX * BSDとlinux上にあるように、両方ともposixになります。

0

FTPはアプリケーションレイヤプロトコルです。 FTPは、TCPまたはUDPソケット上で実行できます。 (EDIT:TFTPおよびUDP上uftp実行、plsは詳細についてはコメントセクションを参照してください):

  1. リンク速度:ように10/100ベースTとを

    ザ・ソケットの速度は、以下の関数です。

  2. リンクのビット誤り率:ビット誤り率(通常、今日の世界では、一般に、電力が-9かその何かか低いか、バースト誤りがある。
  3. ソケットバッファサイズ:Linux上/proc/sys/net/coreパラメータ

:TCPソケットを扱うためにここで良い記事があります[1]

4.Tweakパケット損失を導入する/ドロップパケットをフィルタリングするためにスタック、最終的には流量を絞ることができます。netem [2]のようなツールは、流量を調整するためにバケットを調整するのに役立ちます。

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

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

+2

"FTPはUDPソケットで実行できます" ...この申し立てには証拠が必要です。 –

+1

FTPへの脱退からの議論を避けるため、そこに詳細を提供しませんでした。 1. tftpは、速度のためにudpポート69で動作します。 2.セキュリティのための暗号化を提供するマルチキャストファイル転送であるuftpがあります。 –

+1

TFTPはファイルを転送しますが、FTPは転送しません。同上。 –

関連する問題