web-dev-qa-db-ja.com

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

利用可能なネットワーク接続があるかどうかを判断する最良の方法は何ですか?

108
Brad

GetIsNetworkAvailable() を使用して、.NET 2.0のネットワーク接続を確認できます。

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

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

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
146
Mitch Wheat

マークされた答えは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;
    }
167
Simon Mourier

Microsoft Windows Vistaおよび7は、NCSI(Network Connectivity Status Indicator)技術を使用しています。

  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に解決されるはずです。アドレスが一致しない場合、インターネット接続が正しく機能していないと見なされます。
9

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

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);
1
Kumar