web-dev-qa-db-ja.com

インターネット接続を確認するC#

C#プログラムの実行中にコンピューターにインターネット接続があるかどうかを確認する方法があるかどうか教えてください。簡単な例として、インターネットが機能している場合、Internet is availableというメッセージボックスを出力します。それ以外の場合は、Internet is unavailableというメッセージを出力します。

ライブラリ機能を使用せずにネットワークが利用可能かどうかを確認せずに(これはインターネット接続をチェックしないため)

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

または、Webページを開いて、それがデータを返すかどうかを確認せずに

using (WebClient client = new WebClient())
      htmlCode = client.DownloadString("http://google.com");

上記の方法はどちらも私のニーズに合わないためです。

19
D P.

少し短いバージョン:

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
        using (var stream = client.OpenRead("http://www.google.com"))
        {
            return true;
        }
    }
    catch
    {
        return false;
    }
}

別のオプションは次のとおりです。

Ping myPing = new Ping();
String Host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(Host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) {
  // presumably online
}

より広範な議論を見つけることができます こちら

29
Ofir

次のコードスニペットを検討してください...

Ping myPing = new Ping();
String Host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(Host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) 
{
  // presumably online
}

がんばろう!

8
gpmurthy

私のNetworkMonitorクラスは、これを提供します(他の応答に基づいて):

    public bool IsInternetAvailable
    {
        get { return IsNetworkAvailable && _CanPingGoogle(); }
    }

    private static bool _CanPingGoogle()
    {
        const int timeout = 1000;
        const string Host = "google.com";

        var ping = new Ping();
        var buffer = new byte[32];
        var pingOptions = new PingOptions();

        try {
            var reply = ping.Send(Host, timeout, buffer, pingOptions);
            return (reply != null && reply.Status == IPStatus.Success);
        }
        catch (Exception) {
            return false;
        }
    }
1
Barton

それを行うために非同期関数を作成しました:

private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
    if (e.Cancelled)
        return;

    if (e.Error != null)
        return;

    if (e.Reply.Status == IPStatus.Success)
    {
        //ok connected to internet, do something...
    }
}

private void checkInternet()
{
    Ping myPing = new Ping();
    myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
    try
    {
        myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
    }
    catch
    {
    }
}
1
winsetter

これが私のアプローチです。

  1. ネットワーク接続が利用可能であることを確認します。利用可能でない場合、別のホストに接続できません。
  2. いくつかの主要なホストに接続できるかどうかを確認します。そのサイトが利用できない場合に備えて、フォールバックを使用します。

    public static bool ConnectToInternet(int timeout_per_Host_millis = 1000, string[] hosts_to_ping = null)
    {
        bool network_available = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    
        if (network_available)
        {
            string[] hosts = hosts_to_ping ?? new string[] { "www.google.com", "www.facebook.com" };
    
            Ping p = new Ping();
    
            foreach (string Host in hosts)
            {
                try
                {
                    PingReply r = p.Send(Host, timeout_per_Host_millis);
    
                    if (r.Status == IPStatus.Success)
                        return true;
                }
                catch { }
            }
        }
    
        return false;
    }
    

ノート:

  1. 手を差し伸べるときにあまりにも多くのホストを使用しないでください。成功の可能性が低下することに対して、すべてのpingを実行する時間のコストを比較検討してください。
  2. 後で接続する予定の特定のホストにpingを送信する場合(httpリクエストなど)、pingが返されても、その特定のホストに接続していることにはなりません。ホストがブロックされた場合にどうなるかを検討してください。たとえば、中国のイランでFacebookがブロックされています...そのISPはpingを返しますか?
  3. DNS要求はキャッシュされる可能性があるため、十分ではありません
0
user425678