インターネット転送速度の計測について への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 てんてこ舞  (社会人) 投稿日時 2009/10/27 00:37:07
葉月さんどうもです。
ソースコードまで頂いてありがとう御座います。
参考に出来そうな部分も多数あるので試行錯誤してみます。

聖帝サウザーさんどうもです。
信用性は無いのでしょうけど目安としてより信用性の高い物に挑戦出来ればと思います。
試行錯誤してどうしても駄目な時は諦めます。

お二方ともありがとう御座いました。
投稿者 聖帝サウザー  () 投稿日時 2009/10/23 04:52:51
のぼりとかくだりとか、あまり信用性は無いですね。
情報の一部が記録されてる場合とかの理由もありますし、
セキュリティーの関係とかもありますから。
以上です。
投稿者 葉月  (社会人) 投稿日時 2009/10/23 04:30:42
>>>サンプル
>ネットワーク使用率を求めるのに使っているメソッド
   1. ''' <summary> 
   2. ''' ネットワーク使用率を求める。 
   3. ''' </summary> 
   4. Public Sub percentDemand()

   5.     ' 四捨五入する桁数 
   6.     Const SHORT_NUMBER_ROUND As Short = 4
   7.     ' 占有率を求める際の百分率 
  Const SHORT_PERCENTAGE As Short = 100

   8.     ' ネットワーク使用率(受信) 
   9.     Dim dReceivedPercent As Double = 0
 ' ネットワーク使用率(送信) 
 Dim dSentPercent As Double = 0
  10.    
  11.     ' 計算系の汎用クラス 
  12.     Dim objMyTimeMath As New MyTimeMath()
  13.     Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
  14.    
  15.     For Each adapter As NetworkInterface In nics

  16.         If adapter.OperationalStatus.Equals(OperationalStatus.Up) AndAlso _
Not adapter.NetworkInterfaceType.Equals(NetworkInterfaceType.Loopback) AndAlso _
Not adapter.NetworkInterfaceType.Equals(NetworkInterfaceType.Tunnel) Then

  17.             If adapter.Supports(NetworkInterfaceComponent.IPv4) Then
  18.                 Dim ipv4 As IPv4InterfaceStatistics = adapter.GetIPv4Statistics()
  19.                
  20.                 If Not lReciveTmp.Equals(0) Then
  21.                    
  22.                     ' 受信パケット数 
  23.                     Dim lReceived As Long = ipv4.BytesReceived
          ' 送信パケット数 
  Dim lSent As Long = ipv4.BytesSent
  ' スピード 
  26.                     Dim iSpeed As Double = CDbl(adapter.Speed) / 10

  27.                     dReceivedPercent = (lReceived - Me.lReciveTmp) * CDbl(SHORT_PERCENTAGE) / (iSpeed)
  28.                     dSentPercent = (lSent - Me.lSentTmp) * CDbl(SHORT_PERCENTAGE) / (iSpeed)
  29.                     Me.lReciveTmp = lReceived
  30.                     Me.lSentTmp = lSent
  31.                 Else
  32.                     Me.lReciveTmp = ipv4.BytesReceived
  33.                 End If
  34.                
  35.                 dReceivedPercent = objMyTimeMath.decimalPointOmit(dReceivedPercent, SHORT_NUMBER_ROUND)
  36.                 dSentPercent = objMyTimeMath.decimalPointOmit(dSentPercent, SHORT_NUMBER_ROUND)
  37.                
  38.                 Me.dReceivedPercent = dReceivedPercent
  39.                 Me.dSentPercent = dSentPercent
  40.                 Me.dSentReceivedPercent = dReceivedPercent + dSentPercent
  41.             End If
  42.         End If
  43.     Next
  44.    
  45.     objMyTimeMath = Nothing
  46. End Sub



>MyTimeMathクラス(私が作った駄クラス)で利用しているメソッド
   1. ''' <summary> 
   2. ''' 小数点を省略する。 
   3. ''' </summary> 
   4. ''' <param name="dPercent">省略する値</param> 
   5. ''' <param name="dNumberRound">省略する桁数</param> 
   6. Public Function decimalPointOmit(ByVal dPercent As DoubleByVal sNumberRound As ShortAs Double
   7.     ' 最低値の小数点 
   8.     Const DOUBLE_DECIMAL_POINT As Double = 0.01
   9.    
  10.     If dPercent < DOUBLE_DECIMAL_POINT Then
  11.         dPercent = 0
  12.     ElseIf dPercent.ToString().StartsWith("0."Then
  13.         If dPercent.ToString().Length > sNumberRound Then
  14.             dPercent = Double.Parse(dPercent.ToString().Substring(0, sNumberRound))
  15.         End If
  16.     End If
  17.    
  18.     Return dPercent
  19. End Function

投稿者 (削除されました)  () 投稿日時 2009/10/23 04:25:31
(削除されました)
投稿者 葉月  (社会人) 投稿日時 2009/10/23 04:24:29
てんてこ舞さん、daiveさん、初めましてよろしくお願いします。

汎用的に作成し正確な数値などが必要なら、私が調べた限りだとSDKを扱う必要が出てくるようです。
.NETで作成するよりは、C++など他の言語で作った方がいいかも知れません。
そうなると、私のような万年初心者にはきついですね。

ただ、使うレベルがタスマネなんかにあるNW使用率のレベルでいいなら
VB.NETで十分いけると思います。
そんなこといってて、私はまだ他の環境で動くように作れてないのですが(苦笑)

タスマネのNW使用率のレベルで話を進めます。
受信パケット、または送信パケットを求める必要があり、
パーセンテージを求めるので百分率も使います。

NW使用率(受信) = (今回の受信パケット - 前回の受信パケット) * 100 / 速度
NW使用率(送信) = (今回の送信パケット - 前回の送信パケット) * 100 / 速度

最後にサンプルを紹介します。
サンプルは、私が現在、C#で作成中のものを某サイトを使いVB.NETにコードを変換しています。
変な行数が入っているのはそのためで、
VB.NETにない記述の部分がおかしくなっていました。
感じがつかめるだけでいいと思ったので適当にしか直してません。

サンプルを見てもらえればわかりますが、NetworkInterfaceクラスの理解が必需になります。
MSDNを見て概要だけでも理解してください。

>>>追伸
小数点の部分でオリジナルの駄クラスを使っていますが、
元から用意されているMathクラスを使ってもいいです。
投稿者 てんてこ舞い  (社会人) 投稿日時 2009/10/22 21:40:47
daiveさん何度もすみません。

自分の進んでいる方向から少し角度を変えて試行錯誤してみます。
daiveさんの指摘の通り、1~4についてももっと勉強してみます。
色々とお世話になりました。
また何かわからない事が出てきた時はよろしく御願いします。
投稿者 daive  (社会人) 投稿日時 2009/10/21 03:01:49
>上記のパケットは全体の送受信のパケットだと思うのですが、特定のタスク内の送受信の取得ってのも無理なのでしょうね。

追記です。
やりようは有りますし、やったこともあります。
考え方の問題ですので、

本格的に、オンラインゲームを作りたい場合は、
1.IPプロトコルの理解、UDP/TCPだけでなく。
2.DBの理解
3.Direct-X/XNAなどの理解
4.クライアントーサーバーモデルと、トレードオフの問題

効果音、キャラの作成などの感性etc
が必要に思います。
テトリスなどの、発想だけで勝負できるゲームは、のぞきます。
投稿者 daive  (社会人) 投稿日時 2009/10/21 02:33:56
オンラインゲームは、作ったことがないのですが、

データパケットのやりとりは、UDPのはずです、
TCPでは、パケットの送受信は保証されてるように思うでしょうが、
インターネット上では、保証されませんので、
ゲームの座標データ、移動データなんて、1パケットなくなっても、
支障は、ないですし。

時間を計測する場合は、他の問題として
基準になる時計を、どうするかということがあります。
送信側で一方的に、(受信側でも同じ)判断するのであれば、
時計は、自分の時計を使えばいいですが、相手の時刻をも
気にする場合は、厄介な問題を抱えることになります。

>例で言うと、セキュリティソフトのみのパケット送受信の取得などです。
自分で管理していない、パケットを見るのは、フックを使って、、、
とかになります。ウィルスチックですので、どうなんでしょうねぇ。
実装できるのは、知っていますが、やったことはありません。
投稿者 てんてこ舞い  (社会人) 投稿日時 2009/10/21 02:19:07
daiveさん返信ありがとう御座います。

やはり、パケットのやり取りで行わないと駄目なのですね。
例えば、タスク内の指定したタスクのみのパケットのやり取りなども難しいですよね?
上記のパケットは全体の送受信のパケットだと思うのですが、特定のタスク内の送受信の取得ってのも無理なのでしょうね。

例で言うと、セキュリティソフトのみのパケット送受信の取得などです。
特に仕様用途はありませんが、今後のオンラインゲームなどの作成などの目安にと思いました。
オンラインゲームなどで転送速度に影響すればエラーを出すなどの処理に使いたいと思いまして質問させて頂きました。
投稿者 daive  (社会人) 投稿日時 2009/10/20 23:20:02
何の為に使うかにもよりますが、

送信側:接続プロバイダ→どこかのプロバイダ、(この間不定)、、→相手のプロバイダ:受信側(応答速度もある)


になるので、インターネット上の速度サイトの値は、あまりあてにはなりません。
送り方が、UDPかTCPにもよるかと思いますが、
UDPであれば、パケット送ったよ、パケット受け取ったよという
仕組みから作らないとだめですし。
投稿者 てんてこ舞い  (社会人) 投稿日時 2009/10/20 09:00:37
初めまして。

質問したいのですが、VB2005を使用しています。
OSは Windows XP SP3 です。

現在の自分のインターネットの転送速度を常時計測出来るようなツールを作りたいのですが、このようなツールは初心者には無理でしょうか?

Dim a As System.Net.NetworkInformation.IPGlobalProperties = _
            System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties()
Dim b As System.Net.NetworkInformation.IPGlobalStatistics = _
            a.GetIPv4GlobalStatistics()

System.Console.WriteLine(b.OutputPacketRequests) '送信パケット
System.Console.WriteLine(b.ReceivedPackets) '受信パケット

パケット数は何とかわかったのですが、転送速度、上りや下りなどは取得出来ないのでしょうか?
よろしく御願いします。