Как проверить подключение к сети? - PullRequest
105 голосов
/ 06 февраля 2009

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

Ответы [ 4 ]

164 голосов
/ 01 декабря 2011

Отмеченный ответ в порядке на 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;
    }
142 голосов
/ 06 февраля 2009

Вы можете проверить сетевое соединение в .NET 2.0, используя GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

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

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
9 голосов
/ 09 января 2012

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. Если адрес не совпадает, то предполагается, что интернет-соединение работает неправильно.
1 голос
/ 04 июля 2016

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...