単にライブラリを紹介するのもアレなので,ネットワーク帯域を計測するプログラムをサラっと書いてみて,そのプログラムで使い方を紹介します.帯域計測と言っても,データを流してそのスループットを測ると言う単純なもので,何か(計測用トラヒック減らすための)凄いことをやってる,と言う訳じゃないです:p
適当なサイトからGETでデータをダウンロードして,そのダウンロード時のスループットを計測するプログラムです.まず,下準備として計測用のソケットクラスを作成します
実装部コードは省略.クライアント/サーバ兼用のソケットなので,コンストラクタは 種類あります.クライアント用として使うときは,ホスト名,ポート番号を指定してオブジェクトを作成します.一方,サーバ用として使うときは,clx::tcp::acceptorが,accept()に成功すると通信用のソケットを作成して返すので,そのソケットを引数にしてオブジェクトを作成します.
次に,この計測用ソケットがデータを受信するときの振る舞いを決めるクラスを作成します.
実装部コードは一部のみ掲載.これもクライアント/サーバ兼用にする予定なので,コンストラクタは 種類あります.実際の動作は()演算子の中に書いてある部分で,recv()でデータを受信して,受信したバイト数を(MByte単位で)ソケットに記録します.端末内部がボトルネックになると嫌なのでバッファは大きめに用意しています(1MByteも).ちなみに,読み込んだデータは捨てています:p通信が終了してfalseを返すと,sockmanagerはそのソケットを監視対象から外します.ソケットのクローズはデストラクタが呼ばれたときに行われるのでやらなくてもいいです.
プログラム引数としてURLを与えられると,そのURLに対してGETを行います.GETクエリを投げた後に,sockmanagerに登録してその後は任せます.start()メソッドの引数に秒数を指定すると,その秒数で監視を終了するので,それを利用して一定時間ずつスループットを出力しています.ちなみに,ソケットオブジェクトはstd::tr1::shared_ptr*1で管理しているので,deleteはしません.プログラム引数の解析にargumentやtokenizerを使っていますが,詳細は各リンクを参照して下さい.
実行例は以下のようになります.適当なサイズのファイルがなかったので,SourceForge.netからboost-jam(1MByteくらい)をダウンロードしてみました.
実行例は以下の通り.クライアント側は,iperfを使って実験しています.iperfのクライアント側の実行方法は以下のような形になります.
デフォルトの設定だと,ポート番号は5001,スループット情報の出力は通信終了時のみ,実行時間は10秒になっています.
ネットワーク通信に関するプログラムが楽に早く書けるようになると思うのですが,どうでしょう.