環境:VC++2003、Win32 API(SDK)
ネットワークの送受信の状況を監視して簡易モニターソフトを作りたいです。
分かりやすく言えばタスクマネージャのネットワーク使用率を作りたいのです。
お聞きしたいことは、送受信の状況をどう監視(取得)すればよいのか?
取得方法を教えて下さい。
最終的には送信と受信の状態をグラフで表示することを考えています。
グラフ表示は分かりますので取得方法を教えて下さい。
お願い致します。
やったことはありませんが…
IP HelperのGetIfTableで、MIB_IFTABLE構造体を使います。
この構造体内に各入出力パケットの数が入っているようです。
dwSpeedメンバにインターフェースの速度も入っているようですので
毎秒のパケット数の増加量から計算できるのではないでしょうか?
瀬戸っぷさん。
ヒントをありがとう。
GetIfTableでネット検索したら次のリンクを発見しました。
http://www.geekpage.jp/programming/iphlpapi/functions.php
http://homepage2.nifty.com/spw/tips/GetIfTable.html
http://plaza.rakuten.co.jp/paoproject/?func=diary&act=view&d_date=2007-01-14&d_seq=0000&targetdate=200710
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200509/05090027.txt
ここで検索して気づきましたが、総送信バイト数、総受信バイト数を取得したあと
どのような計算でネットワークの使用率を求めれば良いでしょうか?
以前CPU使用率をモニターするソフトは作りましたが、このときは使用率のパーセントが
そのままdouble型で取得できました。今回は送受信の総合的なバイト数ですよね。
前回の取得と次の取得で増加量は分かりますが、使用率のパーセントの意味がわかりません。
そもそもタスクマネージャの[ネットワーク]タブに表示されるネットワーク使用率(%)は
何を持ってパーセント表示しているのでしょうか?
グラフ表示では0%、0.5%、1%と表示されていて100%ではないです。
ちなみに私の環境では次のように表示されます。
アダプタ名:ローカルエリア接続
ネットワーク使用率:0〜0.44%
リンク速度:100Mbps
状態:稼動中
リンク速度の100Mbpsは光ネットで100なのは分かります。
dwSpeedの速度でどのように計算すれば使用率になりますか?
リンク速度の100Mbpsを元に計算できるのでしょうか?
教えて下さい。
追記。
リンク速度が100Mbpsなので増加量が100Mバイトならば
ネットワーク使用率が100%になると考えてよろしいでしょうか?
こう考えるとタスクマネージャの使用率が0〜0.44%はうなずけます。
HTMLページでデータ量が大きいサイトを更新ボタンで押し続けると
ネットワーク使用率のグラフが0%、2.5%、5%と表示が変わります。
ネットワーク使用率とは、リンク速度(100Mbps)と増加量を元に
計算すれば良いのでしょうか?
このような考え方はあっていますかね。
あっていれば解決にチェックします。
解決。
いろいろと調べたら
>ネットワーク使用率(インターフェースの初期接続速度に基づくネットワーク使用率)や
>リンク速度(初期接続速度に基づくインターフェースの接続速度)を参照することができます。
のようです。
http://dynabook.com/assistpc/faq/pcdata/002656.htm
http://oshiete1.goo.ne.jp/qa2583927.html
解決となっていますが,ちょっと気になったので。
通信速度の単位bpsはbit(s) per second,つまり1秒あたりに通信可能なビット数です。
そのため,100Mbpsの回線とは,12.5Moctets/sの回線であり,その回線上に100MBytes/sのデータが流れることは,
(1Byte = 1Bitという不思議なアーキテクチャでない限り) あり得ません。
YuOさん。
アドバイスありがとうございます。
>通信速度の単位bpsはbit(s) per second,つまり1秒あたりに通信可能なビット数です。
bps=Bit Per Second
これは知っています。
というよりは今回調べて知った。つい昨日ね。
次のリンクの一部で
>dwSpeed; ← 接続速度(bps)
>dwInOctets; ← 総受信バイト数
>dwOutOctets; ← 総送信バイト数
となっています。
これを見る限りは、dwInOctets、dwOutOctets がバイト単位で dwSpeed はビット単位の速度ですよね。
この場合は dwInOctets、dwOutOctets の増加量(バイト)を (dwSpeed / 8) で計算すればいいんですよね。
あるいは、 dwInOctets、dwOutOctets の増加量(バイト)×8倍して dwSpeed でパーセント計算。
このような計算をすればよろしいでしょうか?
どう思います。
追記。
リンクを忘れた。
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200509/05090027.txt
このリンク先に
>dwSpeed; ← 接続速度(bps)
>dwInOctets; ← 総受信バイト数
>dwOutOctets; ← 総送信バイト数
となっています。
> リンク速度の100Mbpsは光ネットで100なのは分かります。
> dwSpeedの速度でどのように計算すれば使用率になりますか?
> リンク速度の100Mbpsを元に計算できるのでしょうか?
光ネットだから100Mというワケではないです。
インターフェースのリンク速度が100Mということになります。
# ウチはYahooBBの50Mタイプですが、下りは3.6Mくらいです。
> これを見る限りは、dwInOctets、dwOutOctets がバイト単位で dwSpeed はビット単位の速度ですよね。
> この場合は dwInOctets、dwOutOctets の増加量(バイト)を (dwSpeed / 8) で計算すればいいんですよね。
> あるいは、 dwInOctets、dwOutOctets の増加量(バイト)×8倍して dwSpeed でパーセント計算。
> このような計算をすればよろしいでしょうか?
とりあえず、考えてみました。
dwSpeedに100000000が得られました。
計算を簡単にする為に1msの速度を求めます。(1000で割るだけですが)
計算上、1msで100000Bit。
マルチメディアタイマーの精度は1msになるように設定しておきます。
1回目、GetIfTableで取得(インターフェースが確定しているならばGetIfEntryでもいいでしょう。)。
取得直後にtimeGetTimeでミリ秒を取得します。
およそ1秒後に同じ方法で2回目の値を取得します。
ミリ秒の取得も同様に。
2回目に取得したミリ秒から1回目に取得したミリ秒を引くと、間に掛かった時間がミリ秒単位で取得できます。
最初に算出した100000を掛けると、理論上での最大転送ビット数が出ます。
2回目の総受信バイトから1回目の総受信バイトを引くと、その間に受信したバイト数が求まります。
そこから、「実際に使ったビット数」と「最大転送可能ビット数」のそれぞれが求まりますから、あとは百分率を求める計算でパーセンテージは出せますよね。
もっとも、この場合のバイト数が通信に使用できるものと同義で見ていいのかは不明ですが。
# COMポートだと「スタートビット」や「ストップビット」等あったりしますし。
## 100BAE-TXなどの速度はあくまで理論値ということになりますので、実際はソコまで速度でないでしょう。
瀬戸っぷさん。
計測方法、計算方法を教えてくれて有り難うございます。
良く考えたらタイマーを使っても1秒調度で取得できませんでしたね。
精度悪いようだから。
> インターフェースのリンク速度が100Mということになります。
リンク速度って最大の通信速度とは違うのでしょうか?
100M(Bit)だから単純に8で割ればバイト数での速度が出るかと思いましたが違うの?
> 2回目の総受信バイトから1回目の総受信バイトを引くと、その間に受信したバイト数が求まります。
> そこから、「実際に使ったビット数」と「最大転送可能ビット数」のそれぞれが求まりますから、
> あとは百分率を求める計算でパーセンテージは出せますよね。
これは「受信したバイト数」×8=「実際に使ったビット数」で
その後「実際に使ったビット数」×100÷「最大転送可能ビット数」=百分率という計算ですか?
これで計算ロジックはあっていますか?
ちなみに次のソフトと同じようなものを作ろうとしています。
http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005172.html
このソフトでいう「帯域幅(接続速度)」がリンク速度(dwSpeed)の値ですか?
またアドバイスをお願いします。
> 良く考えたらタイマーを使っても1秒調度で取得できませんでしたね。
マルチメディアタイマー使っても、誤差は出ると思われますが。
まぁそこは誤差ということで。
> リンク速度って最大の通信速度とは違うのでしょうか?
> 100M(Bit)だから単純に8で割ればバイト数での速度が出るかと思いましたが違うの?
理論上の最高速度です。
実効速度はそこまで出ません。
「100BASE 実効速度」とかで調べると出るかと思いますが。
SerialATAの3Gbpsにしてもソコまで速度出ませんし、
PCIバスの速度も実効速度は多少落ちるかと。
> これは「受信したバイト数」×8=「実際に使ったビット数」で
> その後「実際に使ったビット数」×100÷「最大転送可能ビット数」=百分率という計算ですか?
> これで計算ロジックはあっていますか?
あっています。
スタートビットやら付かなければ…ですが。
その辺りは規格書確認しないと調べようもないです。
もっとも、そこまで精度高いモノを望んでいるかは不明ですが。
> ちなみに次のソフトと同じようなものを作ろうとしています。
> http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005172.html
> このソフトでいう「帯域幅(接続速度)」がリンク速度(dwSpeed)の値ですか?
違うようです。
おそらく、速度計測サイトなどで調べた速度を自分で入力するものかと。
# 起動時にそんなメッセージが出ましたが。
ステータス画面の「接続速度」がリンク速度(dwSpeed)でした。
# 画面例の2.00Mbpsって、何を使っているのか不明ですが。
瀬戸っぷさん。
いろいろとアドバイスを有り難うございます。
この質問のやり取りを参考にちょっと作ってみます。
また不明な点が出てネット検索しても解決しないときには質問します。
この質問は一応の解決とさせて頂きます。
何かあればまたお願いします。
定期的に覗きに来ますので。
ツイート | ![]() |