Как я могу узнать, был ли сетевой кабель отключен? - PullRequest
6 голосов
/ 20 мая 2009

У меня есть приложение на C #, которое следует использовать только когда сеть не работает, но боюсь, что пользователи просто отключат сетевой кабель, чтобы использовать его.

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

Спасибо

Ответы [ 9 ]

6 голосов
/ 20 мая 2009

Вы можете использовать IsNetworkAlive (). Хотя технически он не проверяет состояние канала, он, вероятно, лучше, поскольку он также может обнаруживать беспроводное и коммутируемое соединение. Вот пример:

using System.Runtime.InteropServices;
class Program
{
    [DllImport("sensapi.dll")]
    static extern bool IsNetworkAlive(out int flags);

    static void Main(string[] args)
    {
        int flags;
        bool connected = IsNetworkAlive(out flags);

    }
}

Параметр flags возвращает ли подключение к Интернету или просто к локальной сети. Я не уверен на 100%, как он это знает, но готов поспорить, что он просто смотрит, есть ли установлен шлюз по умолчанию.

4 голосов
/ 20 мая 2009

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

Давайте предположим, что у вас есть решение, и давайте рассмотрим некоторые ситуации:

  • Нет сетевого трафика, кабель не отключен от компьютера: он может быть отключен на другом конце.
  • Нет сетевого трафика, кабель отключен: но это всегда имело место, ноутбук подключен через Wi-Fi, который в данный момент не работает.
  • Существует несколько сетевых интерфейсов, только один из них подключен к WAN: не работает ли ваше приложение?
  • Сеть фактически не работает в том смысле, что вы имеете в виду: кому-то удалось непрерывно перезагрузить маршрутизатор для использования вашего приложения.
3 голосов
/ 04 сентября 2012

Вы можете использовать это

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
2 голосов
/ 20 мая 2009

Некоторые сетевые драйверы способны обнаружить это. Однако вам потребуется использовать неуправляемый код для доступа к ним из C # (что может быть очень сложно / невозможно), и решение может быть не надежным для всех сетевых адаптеров.

1 голос
/ 13 августа 2012

Вы можете зарегистрировать делегата в классе NetworkChange. Когда происходит изменение сети, оно фактически не уведомляет вас о том, что произошло, поэтому вы можете перечислить все сетевые интерфейсы (используя NetworkInterface), отфильтровать те, которые вас интересуют (проверив там свойства), и проверить их рабочее состояние. 1003 *

1 голос
/ 20 мая 2009

Сетевая карта сообщит об этом как о состоянии. Такие инструменты, как ethtool, могут отображать это (Link up), но это доступно только для Linux / Unix.

Если вы можете перечислить установленные сетевые карты с помощью Windows API, я уверен, что где-то там вы найдете флаг "link up".

0 голосов
/ 06 октября 2015

Чтобы определить, «подключен ли сетевой кабель к машине?», Работает следующий фрагмент кода.

class Program
{
    private static void Main(string[] args)
    {
        bool isNetworkCableConnected = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    } 
}
0 голосов
/ 20 мая 2009

Как насчет пинга шлюза по умолчанию?

Здесь есть некоторый код , который получает шлюз по умолчанию из реестра.

0 голосов
/ 20 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...