Как проверить наличие сетевого подключения?



каков наилучший способ определить, есть ли сетевое подключение?

529   4  

4 ответов:

вы можете проверить наличие сетевого подключения в .NET 2.0 с помощью GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

для отслеживания изменений в IP-адресе или изменений в доступности сети используйте события из NetworkChange класс:

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

отмеченный ответ на 100% прекрасен, однако есть определенные случаи, когда стандартный метод обманывается виртуальными картами (virtual box, ...). Также часто желательно отказаться от некоторых сетевых интерфейсов в зависимости от их скорости (последовательные порты, модемы, ...).

вот кусок кода, который проверяет эти случаи:

    /// <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;
    }

Microsoft windows vista и 7 используют NCSI (индикатор состояния сетевого подключения) техника:

  1. NCSI выполняет поиск DNS на www.msftncsi.com, затем просит http://www.msftncsi.com/ncsi.txt. этот файл является обычным текстовым файлом и содержит только текст'Microsoft NCSI'.
  2. NCSI отправляет запрос поиска DNS для dns.msftncsi.com. этот DNS-адрес должен разрешаться до 131.107.255.255. Если адрес не совпадает, то это предположить, что подключение к интернету не правильно.

вызовите этот метод для проверки сетевого подключения.

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

Comments

    Ничего не найдено.