LANに接続して通信を行うプログラムなどで、実際の通信を開始する前に「通信相手が存在するか」を確認する必要があります。
自分ひとりで使うだけであれば、コマンドプロンプトなどでpingコマンドを打てば事足りますが、いろいろな環境下で使用されるプログラムとなるとそうもいきません。
.NET Frameworkでping
.NET Framework 2.0からは、System.Net.NetworkInformation.Pingクラスがあり、このクラスを使ってプログラムからネットワーク上の特定のコンピュータへICMP(Internet Control Message Protocol)エコー・メッセージ(いわゆるpingパケット)を送信して、その応答で相手のコンピュータの存在をチェックできます。
pingでの確認には同期通信と非同期通信による2つの方法がありますが、今回は同期通信だけ紹介します。
Pingクラスを使う
Pingクラスのインスタンスを作成し、Sendメソッドを呼び出すだけです。
ただ、pingを送って応答を判定するだけのサンプルプログラムです。
string address = "192.168.0.1"; Ping sender = new Ping(); for(int i = 0; i < 4; i++) { PingReply reply = sender.Send(address); if(reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); } else { Console.WriteLine(reply.Status); } // ping送信の間隔を取る if(i < 3) { System.Threading.Thread.Sleep(1000); } }
このままでも普通にpingを送信して、応答を受信して判定もできます。
ちょっと応用
このPing.Send()にはオーバーロードがいくつかあり、引数に送信先と「タイムアウト時間の指定」ができます。
さらに、同一LANのIPアドレスすべてに1度だけ送って疎通確認を行います。
サンプルプログラムです。
int oct1 = 192; // IPアドレスの第1オクテット int oct2 = 168; // IPアドレスの第2オクテット int oct3 = 0; // IPアドレスの第3オクテット string address = string.Empty; // 送信するIPアドレス // 第4オクテットを1から255までループします for(int oct4 = 1; oct4 <= 255; oct4++) { address = string.Format("{0}.{1}.{2}.{3}", oct1, oct2, oct3, oct4); System.Net.NetworkInformation.Ping sender = new System.Net.NetworkInformation.Ping(); // タイムアウト時間50msecで送信します System.Net.NetworkInformation.PingReply reply = sender.Send(address, 50); if (reply.Status == System.Net.NetworkInformation.IPStatus.Success) { Console.WriteLine("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); } else { //Console.WriteLine("No Reply from {0} Status={1}", address, reply.Status); } } Console.WriteLine("\nPing.Send Ended.");
これだけでも、同一ネットワーク内の通信先のチェックができます。