Как обнаружить рабочее интернет-соединение в C#?

У меня есть код C#, который в основном загружает файл по протоколу FTP (использование FtpWebRequest). Я хотел бы, однако, сначала определить, существует ли рабочее интернет-соединение прежде, чем попытаться загрузить файл (так как, если нет нет никакого смысла в попытке, программное обеспечение должно просто спать какое-то время и проверка снова).

Существует ли простой способ сделать это, или я должен просто попытаться загрузить файл и в случае, если это перестало работать, просто попробовали еще раз, предполагая, что сетевое соединение снизилось?

28
задан Detariael 26 March 2010 в 06:58
поделиться

4 ответа

Существует событие «доступность сети изменена», которое запускается, когда состояние «включено» сетевого соединения изменяется на интерфейсе, который не является туннелем или кольцевой проверкой.

Вы можете прочитать состояние всех сетевых адаптеров в системе при запуске, сохранить текущее значение «сеть доступна», затем прослушать это событие и изменить переменную состояния сети при его возникновении. Похоже, он также будет обрабатывать коммутируемые соединения и соединения ISDN.

Допустим, есть и другие факторы, которые следует учитывать, например, сетевая карта подключена к маршрутизатору (и работает), но подключение к Интернету на маршрутизаторе не работает, или удаленный хост не отвечает, но это, по крайней мере, предотвратит вы пытаетесь установить соединение, которое не будет работать, если для начала нет сетевого подключения (например, соединение VPN или ISDN не работает.)

Это консольное приложение C # - запустите его, затем отключите или отключите сетевое соединение: -)

class Program
{
    static bool networkIsAvailable = false;

    static void Main(string[] args)
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface nic in nics)
        {
            if (
                (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) &&
                nic.OperationalStatus == OperationalStatus.Up)
            {
                networkIsAvailable = true;
            }
        }

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);

        NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);

        Console.ReadLine();
    }

    static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        networkIsAvailable = e.IsAvailable;

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);
    }
}
14
ответ дан 28 November 2019 в 02:37
поделиться

Я думаю, что лучшее приближение , которое вы можете использовать, - это проверить значение OperationalStatus в типе NetworkInterface .

using System.Net.NetworkInformation;

public bool IsNetworkLikelyAvailable() {
  return NetworkInterface
    .GetAllNetworkInterfaces()
    .Any(x => x.OperationalStatus == OperationalStatus.Up);
}

Помните, что это приблизительное значение. В тот момент, когда этот метод возвращает, компьютер может потерять или получить подключение к Интернету. ИМО, я бы сразу пошел на загрузку и обработал ошибку, так как вы не можете доказать, что этого не произойдет.

12
ответ дан 28 November 2019 в 02:37
поделиться

Разве вы не можете просто использовать класс Ping из пространства имен System.Net.NetworkInformation для проверки связи FTP-сервер перед загрузкой файла?

6
ответ дан 28 November 2019 в 02:37
поделиться

Подумайте о ситуации, когда ваш чек возвращается и говорит: «соединение есть», и прежде чем вы сможете запустить свой FTP, соединение разрывается.

Или когда соединение прерывается на этапе выполнения вашего FTP-запроса.

Учитывая, что вы все равно должны кодировать эти ситуации , просто пропустите проверку

Изменить в ответ на комментарии Джейсона

Вы также можете иметь противоположное условие - когда вы проверяете наличие связь, ничего не существует, но мгновение спустя их связь возникает. Итак, что вы теперь делаете - начинаете ли вы придираться к пользователю об отсутствии соединения, даже если оно сейчас доступно?

В конце концов, вы имеете дело с большим количеством ресурсов (ваше сетевое соединение , любые промежуточные маршрутизаторы, хост, его FTP-сервис). Все это может быть изменено вне вашего контроля (как указано в комментарии Сета), и никакое предварительное тестирование не даст ответа на вопрос «смогу ли я завершить эту загрузку?»

Поскольку OP указал, что он думает подхода «отступить и повторить попытку позже», то я думаю, что уместно делать все это в фоновом режиме и совсем не раздражать пользователя - если только вы не пытались безуспешно в течение «необоснованного» количества времени.

6
ответ дан 28 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: