C#でpingを送信したい。。。
ネットワーク上に通信相手となるPC やネットワーク機器が存在するかどうかを、事前に確認する手段として ping があります。 コマンドプロンプトやWindowsターミナルを起動してping <ホスト名またはIPアドレス>
を入力すれば確認できますが、C# で作ったアプリでも同じように確認したいという場面があるかと思います。
C# で ping を送信するにはSystem.Net.NetworkInformation.Ping
クラスを使用します。
.NET Framework 2.0 からSystem.Net.NetworkInformation.Ping
クラスが追加されており、このクラスを使うことでプログラムからネットワーク上の通信相手となるPC やネットワーク機器へ「 ICMP(Internet Control Message Protocol)」を送信して、その応答で通信相手のデバイスの存在をチェックできます
この記事では、ping を同期または非同期で送信する方法を紹介しています。ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
pingとは?
ping とは、ネットワーク上の PC やネットワーク機器が正常に接続されているかどうかを確認するためのコマンドです。
さらに詳しく説明すると、IP のエラーメッセージなどを返すプロトコル「ICMP(Internet Control Message Protocol)」を使用して、ネットワーク上のホストの疎通状況やエラーの内容を確認することができます。
Windows OS で ping を使う場合はコマンドプロンプト(cmd)や Windows ターミナルを開いて、次のように入力します。
ping <ホスト名またはIPアドレス>
コマンドを実行すると、ICMP パケットが4回送信されて、返されたパケットのサイズや受信するのにかかった時間(ミリ秒単位)が表示されます。
>ping 192.168.1.1
192.168.1.1 に ping を送信しています 32 バイトのデータ:
192.168.1.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.1.1 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
これを C# で行う方法をこの記事では紹介します。
pingの使い方
Pingクラスでは同期で ping を送信するSend
メソッドまたは非同期で ping を送信するSendPingAsync
メソッドが使えます。
これらのメソッドでは送信先はホスト名または IP アドレスを文字列として指定するか、IP アドレスをIPAddress
クラスで指定することができます。
環境
- プログラミング言語:C#
- 開発環境:Visual Studio 2022
- フレームワーク:.NET 7.0
pingを同期で送信する
まずは同期で ping を送信する方法を紹介します。
Send(string ip)
Ping
クラスのインスタンスを生成して、Send
メソッドを呼び出します。
using System.Net.NetworkInformation;
var ping = new Ping();
var address = "192.168.0.1";
Console.WriteLine($"{address}にpingを送信しています...");
try
{
// 指定したIPアドレスにpingを送信する
var reply = ping.Send(address);
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("{0} からの応答: バイト数={1} 時間={2}ms TTL={3}",
reply.Address,
reply.Buffer.Length,
reply.RoundtripTime,
reply.Options?.Ttl ?? 0);
}
else
{
Console.WriteLine($"失敗しました ({reply.Status})");
}
}
catch (PingException ex)
{
Console.Error.WriteLine(ex.Message);
}
ネットワーク上に通信相手が存在する場合、次のようになります。
192.168.0.1にpingを送信しています...
192.168.0.1 からの応答: バイト数=32 時間=0ms TTL=128
ネットワーク上に通信相手が存在しない場合、次のようになります。
192.168.0.1にpingを送信しています...
失敗しました (DestinationHostUnreachable)
Send
メソッドにはオーバーロードがあり、ping を送信する時のタイムアウト時間を引数で指定できます。
Send(string ip, int timeout)
次の例ではタイムアウト時間を指定して、ping を送信しています。
using System.Net.NetworkInformation;
var ping = new Ping();
var address = "192.168.0.1";
Console.WriteLine($"{address}にpingを送信しています...");
try
{
// 指定したIPアドレスにpingを送信する
var reply = ping.Send(address, 50);
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("{0} からの応答: バイト数={1} 時間={2}ms TTL={3}",
reply.Address,
reply.Buffer.Length,
reply.RoundtripTime,
reply.Options?.Ttl ?? 0);
}
else
{
Console.WriteLine($"失敗しました ({reply.Status})");
}
}
catch (PingException ex)
{
Console.Error.WriteLine(ex.Message);
}
ネットワーク上に通信相手が存在せずタイムアウトした場合、次のようになります。
192.168.0.1にpingを送信しています...
失敗しました (TimedOut)
pingを非同期で送信する
続いて非同期で ping を送信する方法を紹介します。
SendPingAsync(string ip, int timeout)
Ping
クラスのインスタンスを生成して、SendPingAsync
メソッドを呼び出します。
using System.Net.NetworkInformation;
var ping = new Ping();
var address = "192.168.0.1";
Console.WriteLine($"{address}にpingを送信しています...");
try
{
// 指定したIPアドレスにpingを送信する
var reply = await ping.SendPingAsync(address);
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("{0} からの応答: バイト数={1} 時間={2}ms TTL={3}",
reply.Address,
reply.Buffer.Length,
reply.RoundtripTime,
reply.Options?.Ttl ?? 0);
}
else
{
Console.WriteLine($"失敗しました ({reply.Status})");
}
}
catch (PingException ex)
{
Console.Error.WriteLine(ex.Message);
}
ネットワーク上に通信相手が存在する場合、次のようになります。
192.168.0.1にpingを送信しています...
192.168.0.1 からの応答: バイト数=32 時間=0ms TTL=128
ネットワーク上に通信相手が存在せずタイムアウトした場合、次のようになります。
192.168.0.1にpingを送信しています...
失敗しました (TimedOut)
Pingクラスには非同期メソッドとしてSendPingAsync
以外にSendAsync
がありますが、以下の違いがあります。
SendAsyncメソッド
- .NET Framework 4.5以降で利用可能
- PingCompletedイベントを使用して、非同期操作の完了を通知する
SendPingAsyncメソッド
- .NET Core 2.1以降で利用可能
- await で非同期操作の完了を待機し、PingReplyオブジェクトを返す
まとめ
この記事では、C# で ping を送信する方法を紹介しました。
System.Net.NetworkInformation.Ping
クラスのメソッドを使うことで、ネットワーク上にある通信相手が存在するかどうかをチェックすることが可能です。
SendAsyncメソッド
ICMP (インターネット制御メッセージ プロトコル) エコー メッセージを指定されたコンピューターに送信し、そのコンピューターから対応する ICMP エコー応答メッセージを受信します。
SendAsyncメソッド
指定されたコンピューターに、非同期的に ICMP (インターネット制御メッセージ プロトコル) エコー メッセージを送信し、そのコンピューターから対応する ICMP エコー応答メッセージを受信します。
SendPingAsyncメソッド
非同期操作として、指定されたコンピューターに、指定されたデータ バッファーと共に ICMP (インターネット制御メッセージ プロトコル) エコー メッセージを送信し、そのコンピューターから対応する ICMP エコー応答メッセージを受信します。
以上、最後まで読んで頂きありがとうございました。