|
ついに Ping がうてるようになった InetAddress |
||||
|
||||
リモートのマシンが正しく動いているか確かめるときに、ping はよく使われると思います。 ping は ICMP (Internet Control Message Protocol) というプロトコルを使用して行います。詳細は省略しますが、ICMP のエコーを使用して、マシンへの到達可能性 (Reachability) を確認するために使用されます。 詳しいことは RFC792 をご参照ください。 ICMP は TCP や UDP と同じように IP をベースにしているのですが、Tiger 以前では TCP や UDP は使えたのですが、ICMP だけは使うことができませんでした。 Tiger になってやっと ICMP が使えるようになりました。とはいっても実際に使えるのは Ping だけです。それもかなり機能は削られています。 というのも、ICMP で扱うタイプとコードの情報はまったく扱うことができずに、単にエコーに対する返信があったかどうかだけをチェックするものだからです。 それでも、ないよりましなので、さっそく使い方を調べてみましょう。
|
|
|||||||||
使い方は簡単です。
このサンプルは Ping の動作をシミュレートするようなサンプルです。 さて、Reachability をチェックするには InetAddress#isReachable メソッドを使用します。このメソッドは引数によって 2 種類提供されています。一方が簡単なものでタイムアウトの時間だけを指定するもの。もう一方がネットワークインタフェース、TTL そしてタイムアウトを使用するものです。 通常はタイムアウトを指定するものだけで十分だと思います。 Reachability をチェックするには次のようにします。
Socket クラスのようにポートを指定する必要はないので、InetSocketAddress クラスを使う必要はなく、InetAddress クラスを使用します。 また、Socket クラスとは異なり、プロトコルをハンドリングする必要もありません。単に isReachable メソッドをコールするだけです。 引数のタイムアウトはミリ秒なのですが、型は int です。通常、ミリ秒を表すときには long が使用されるので、ちょっとだけ注意が必要です。 戻り値は boolean なので、結果がタイムアウトなのか Unreachable なのかは判断できません。 サンプルの ReachabilityTest クラスでは開始時間と終了時間をチェックして、(終了時間 - 開始時間) がタイムアウト以上ならタイムアウトと判断しています。 ただ、Windows だとそのあたりをちゃんとハンドリングしていないみたいです。すべてタイムアウトになってしまいます。ちょっと if 文が深くなってしまって読みにくいかもしれませんが、サンプルで Reachability をチェックしている部分を載せておきます。
コードは長いですが、実際の Reachability のチェックはたった 1 行。あとは経過時間や最大、最小時間などを調べています。 さて、これを実行してみましょう。まずはローカルホストから。
同じように yahoo.com についてもやってみました。
実際にはないマシンに対して行ってみます。10.0.0.1 はプライベートアドレスなので、公開されているものはないはずです。
すべてタイムアウトになりました。 私の使用している環境では IPv6 が使えないので、確かめることはできないのですが、IPv6 の ping6 も使用できるはずです。誰か確かめて、結果を教えてください。
|
|
||||
ICMP が使えなかったことよりは、1 歩前進して ping はうてるようになりました。しかし、エコーの戻りの解析はできません。でも、どこまでそれをやる必要があるかを考えると、なくてもいいのかもしれません。 ともあれ、できなかったことができるようになったので、よしとしましょう。
今回使用したサンプルはここからダウンロードできます。
参考
(Jun. 2004) |
|