ネットワーク接続を確認するにはどうすればよいですか?


回答:


153

.NET 2.0でネットワーク接続を確認するには、次を使用しますGetIsNetworkAvailable()

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

IPアドレスの変更またはネットワークの可用性の変更を監視するには、NetworkChangeクラスのイベントを使用します。

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
これは「限られた可用性」を処理しますか?
tofutim '13 / 09/13

これはWPFでは常に機能するとは限りません。一部のラップトップはfalseを返し、一部はtrueを返します
krilovich

これは本当に機能しますか?この行を書いてルーターをオフにしても、trueが返されます。
Mushfiq 2017年

1
NetworkInterface.GetIsNetworkAvailable()特に仮想マシンで実行している場合、私のアプリケーション(.NET 4.5、Windows 10)では非常に信頼性が低くなっています。からのイベントの処理はNetworkAvailabilityChanged信頼できます。
eskimwier 2017

それは信頼できません。stackoverflow.com/a/25779403/2377343を
T.Todua

174

マークされた回答は100%正常ですが、標準の方法が仮想カード(仮想ボックスなど)にだまされる場合があります。また、速度に基づいて一部のネットワークインターフェイス(シリアルポート、モデムなど)を破棄することが望ましい場合もあります。

これらのケースをチェックするコードの一部を次に示します。

    /// <summary>
    /// Indicates whether any network connection is available
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable()
    {
        return IsNetworkAvailable(0);
    }

    /// <summary>
    /// Indicates whether any network connection is available.
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable(long minimumSpeed)
    {
        if (!NetworkInterface.GetIsNetworkAvailable())
            return false;

        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            // discard because of standard reasons
            if ((ni.OperationalStatus != OperationalStatus.Up) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
                continue;

            // this allow to filter modems, serial, etc.
            // I use 10000000 as a minimum speed for most cases
            if (ni.Speed < minimumSpeed)
                continue;

            // discard virtual cards (virtual box, virtual pc, etc.)
            if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
                (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
                continue;

            // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
            if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
                continue;

            return true;
        }
        return false;
    }

17
これは正しく、多くの賛成票に値します-受け入れられた回答で言及されているNetworkAvailabilityChangedイベントが確実に発生しないことがわかりました。これは、おそらくこの回答で言及されている仮想アダプタが原因である
Marek

1
仮想マシンの追加チェックのために+1。昨日この事件に遭遇しただけです。ただし、名前に「virtual」が含まれていないため、これでも「Hype-V」を処理できないと思います。
Herdo、2014

3
@Herdo-はい、コードは完璧ではありません。仮想世界で完璧なものがあるとは思いません。しかし、あなたはそれを改善することができます。
Simon Mourier 14

@SimonMourierあなたは正しいです。誰かがまだtrueを返す場合、接続がない場合は注意してください->これは問題である可能性があります:)
Herdo

1
@noelicus-これまで取り組んできたプロジェクトで、サーバーが「ダウン」(到達不能)として検出されたときにイベントを発生させる定期的な監視/ポーリングシステム(Webサーバーを対象としていたため、単純なHTTP GETリクエスト)を実装しましたHTTPによる)または「アップ」(再び到達可能)。一般的なケースでは、「信頼できる」という意味を定義して、同様のロジックを実装できます。
Simon Mourier、2015

9

Microsoft Windows Vistaおよび7では、NCSI(ネットワーク接続ステータスインジケータ)技術を使用しています。

  1. NCSIはwww.msftncsi.comでDNSルックアップを実行し、次にhttp://www.msftncsi.com/ncsi.txtを要求します。このファイルはプレーンテキストファイルであり、テキストのみが含まれています ' Microsoft NCSI」。
  2. NCSIは、dns.msftncsi.comのDNSルックアップ要求を送信します。このDNSアドレスは、131.107.255.255に解決されるはずです。アドレスが一致しない場合、インターネット接続が正しく機能していないと見なされます。

3
これはすばらしいことですが、技術的には「ネットワーク」の可用性についてではなく、「http経由でインターネットに接続できますか?」完全なネットワーク接続は可能ですが、スタンドアロンLANなどのインターネットへの接続はありません。NCSIの詳細については、technet.microsoft.com
en

1

このメソッドを呼び出して、ネットワーク接続を確認します。

public static bool IsConnectedToInternet()
        {
            bool returnValue = false;
            try
            {

                int Desc;
                returnValue = Utility.InternetGetConnectedState(out Desc, 0);
            }
            catch
            {
                returnValue = false;
            }
            return returnValue;
        }

これをコード行の下に置きます。

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.