|
.NET TIPS pingパケットを送受信するには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2006/03/03 |
![]() |
|
|
|
.NET Framework 2.0では、新たにPingクラス(System.Net.NetworkInformation名前空間)が追加されている。Pingクラスを使用すれば、TCP/IPネットワーク上の特定のコンピュータへICMP(Internet Control Message Protocol)エコー・メッセージ(いわゆるpingパケット)を送信し、その応答を受信することで、リモート・コンピュータへのパケットの到達性を確認したり、ネットワーク上での応答速度を測定したりできる。本稿では、このPingクラスの基本的な利用方法を解説する。
Pingクラスによるpingパケットの送信とその応答受信の方法には、次の2種類が存在する。
- 同期通信(=基本的に、応答が返ってくるまで制御が戻らない)
- 非同期通信(=送信し終わると即座に制御が戻る)
本稿ではこのうち、同期通信でpingパケットを送信する方法を紹介する。非同期で送信する方法については、MSDNの「Ping.SendAsyncメソッド」の説明を参照してほしい。
同期通信でpingを送信するには?
同期通信でpingパケットを送信するには、Pingクラスのインスタンスを作成し、Sendメソッドを呼び出せばよい。
このSendメソッドにはいくつかのオーバーロードがあるが(詳しくはMSDNのページを参照してほしい)、ここでは(最もシンプルに使える)IPアドレスやホスト名を文字列でパラメータに指定できるバージョンのSendメソッドを使ったサンプル・プログラムを示す。
|
||
| 同期通信でpingパケットを送信するサンプル・プログラム(上:C#、下:VB) |
このサンプル・プログラムでは、実際にpingパケットを送信する前に、送信先のホスト名とIPアドレスをDnsクラスのGetHostEntryメソッドを使って取得している。これについては、「TIPS:IPアドレス←→ホスト名を変換するには?」が参考になる。
上記のコードを見ると分かるように、Ping.Sendメソッドの戻り値は、PingReplyクラス(System.Net.NetworkInformation名前空間)のオブジェクトである。このPingReplyオブジェクトが持つプロパティから、以下のようなping応答の情報を取得することができる(※以下の表は、ping送信情報ではなく、ping応答情報であることに注意すること)。
| プロパティ | 説明 |
| Status | IPStatus列挙体(System.Net.NetworkInformation名前空間)の値により送信結果を表す。送信成功の場合は、「IPStatus.Success」という値になる。それ以外の結果情報については、MSDNのページを参照してほしい |
| Address | ping応答パケットの送信元IPアドレス |
| Buffer.Length | 受信したデータのバッファ・サイズ(※ちなみにpingパケット送信時において、Ping.Sendメソッドにより送信されるデータのデフォルトのバッファ・サイズは32bytesだが、バッファ・サイズをパラメータに取るバージョンのSendメソッドを使えば、任意のバッファ・サイズを指定して送信することもできる) |
| RoundtripTime | pingパケットを送信してから返答が戻ってくるまで(=ラウンドトリップ)の時間。OSの最小計測単位時間(=1ms)よりも速く戻ってきた場合は、0となることがある |
| Options.Ttl |
IPパケットを転送(IPフォワード)できる有効回数(TTL:Time to Live)。ルータやゲートウェイを通過するたびにこのTTL値はデクリメントされ、値が0になると、そのパケットは配信不能と判断され破棄される。パケットが到達可能なネットワーク的な距離(通過可能なルータ数)を制限するために利用される(値はping応答パケット送信側のOSによって異なる。ちなみに、Windows OSのTTLのデフォルト値は128である)。 ※このオプションはpingパケット送信時に指定することもできる。これにはPingOptionsオブジェクトをパラメータに取るバージョンのSendメソッドを使えばよい(なお、PingOptionクラスのインスタンスを生成した際のTtlプロパティの初期値は128となる) |
| Options.DontFragment | 送信パケットのフラグメンテーション(=IPパケットを複数のパケットに分割すること)を許可するかどうかを表すBoolean値。大きなサイズのIPパケットの送信時には自動的にフラグメンテーションが行われるが、これを明示的に禁止することにより、ネットワークのMTUサイズ(Maximum Transmission Unit:一度に送信可能なパケット・サイズ)を調査するのに役立つ。送信時にこのフラグをTrueにしてpingを送信すると、応答でもこのフラグがTrueになってパケットが戻ってくる。 ※実際にはこのオプションは、受信結果で得るデータではなく、送信時に指定するものである。これにはPingOptionsオブジェクトをパラメータに取るバージョンのSendメソッドを使えばよい(なお、PingOptionクラスのインスタンスを生成した際のDontFragmentプロパティの初期値はFalseとなる) |
| PingReplyオブジェクトから利用可能なping応答情報に関するプロパティ | |
ちなみにこのサンプル・プログラムの実行結果は次のようになる。
|
|
| 同期通信でpingパケットを送信するサンプル・プログラムの実行結果 | |
| ラウンドトリップ時間(time)が0ミリ秒(0ms)になっているのは、OS内蔵のタイマーの最小単位が1msしかないため、1ms未満で戻ってくると0msとしか表現できないからだ。 |
なおVisual Basic 2005のMy機能を利用する場合は、次のメソッドを呼び出すことでもpingパケットを送信できる。
|
|
| My機能を使って同期通信のpingパケットを送信するコード(VB) |
ただしこのメソッドでping送信を行った場合、その戻り値は送信成功(True)か、失敗(False)かを示すBoolean型のデータとなる。このため、Ping.Sendメソッドを呼び出してPingReplyオブジェクトを取得したときのような、詳細なping送信結果の情報は得られないことに注意してほしい。![]()
| カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 使用ライブラリ:Pingクラス(System.Net.NetworkInformation名前空間) 使用ライブラリ:PingReplyクラス(System.Net.NetworkInformation名前空間) 使用ライブラリ:IPStatus列挙体(System.Net.NetworkInformation名前空間) 使用ライブラリ:PingOptionsクラス(System.Net.NetworkInformation名前空間) 関連TIPS:IPアドレス←→ホスト名を変換するには? |
|
||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


