.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」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
|
|
|
![]() |