Наличие определенного сетевого интерфейса IPv4 - Нет подключения, Локальный, Интернет - PullRequest
4 голосов
/ 06 ноября 2011

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

        NetworkInterface[] nets = NetworkInterface.GetAllNetworkInterfaces();

        foreach (var n in nets)
        {
            // TODO: determine connectivity status of each network interface
            // ( mainly interested in IPv4 connectivity )
        }

, т. Е. Извлечения для каждого интерфейса статуса как Интернет, Местный, Ограниченный или Нет

Windows 7 has this connectivy information

Ответы [ 2 ]

5 голосов
/ 09 февраля 2015

Как уже упоминалось в комментарии выше, вам нужно использовать диспетчер списка сетей, как объяснено там

Для этого сначала добавьте ссылку на него, как показано на скриншоте ниже. Щелкните правой кнопкой мыши по вашему проекту в решении Visual Studio. Выберите Add> Reference ... Перейдите в COM и найдите запись «Библиотека типов Network List Manager 1.0», используя окно поиска.

Add Network List Manager Reference To Your Project

Это сгенерирует Interop DLL для этого COM-интерфейса в вашей двоичной папке вывода. Эта DLL-библиотека называется Interop.NETWORKLIST.dll.

В обозревателе решений вы можете щелкнуть правой кнопкой мыши ссылку на только что добавленную ссылку NETWORKLIST и выбрать «Просмотр в обозревателе объектов», чтобы проверить интерфейсы, к которым вы получаете доступ.

enter image description here

Здесь вы можете реализовать класс Network Manager, как показано ниже, для подписки на события изменения подключения.

using System;
using System.Runtime.InteropServices.ComTypes;
using System.Diagnostics;
using NETWORKLIST;

namespace SharpDisplayManager
{
    public class NetworkManager: INetworkListManagerEvents, IDisposable
    {
        public delegate void OnConnectivityChangedDelegate(NetworkManager aNetworkManager, NLM_CONNECTIVITY aConnectivity);
        public event OnConnectivityChangedDelegate OnConnectivityChanged;

        private int iCookie = 0;
        private IConnectionPoint iConnectionPoint;
        private INetworkListManager iNetworkListManager;


        public NetworkManager()
        {
            iNetworkListManager = new NetworkListManager();
            ConnectToNetworkListManagerEvents();
        }

        public void Dispose()
        {
            //Not sure why this is not working form here
            //Possibly because something is doing automatically before we get there
            //DisconnectFromNetworkListManagerEvents();
        }


        public INetworkListManager NetworkListManager
        {
            get { return iNetworkListManager; }
        }

        public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
        {
            //Fire our event
            OnConnectivityChanged(this, newConnectivity);
        }

        public void ConnectToNetworkListManagerEvents()
        {
            Debug.WriteLine("Subscribing to INetworkListManagerEvents");
            IConnectionPointContainer icpc = (IConnectionPointContainer)iNetworkListManager;
            //similar event subscription can be used for INetworkEvents and INetworkConnectionEvents
            Guid tempGuid = typeof(INetworkListManagerEvents).GUID;
            icpc.FindConnectionPoint(ref tempGuid, out iConnectionPoint);
            iConnectionPoint.Advise(this, out iCookie);

        }

        public void DisconnectFromNetworkListManagerEvents()
        {
            Debug.WriteLine("Un-subscribing to INetworkListManagerEvents");
            iConnectionPoint.Unadvise(iCookie);
        } 
    }
}

Вы можете создать экземпляр своего Network Manager следующим образом:

iNetworkManager = new NetworkManager();
iNetworkManager.OnConnectivityChanged += OnConnectivityChanged;

После получения событий изменения подключения вы можете проверить атрибуты IsConnectedToInternet и IsConnected, как показано ниже:

    public void OnConnectivityChanged(NetworkManager aNetwork, NLM_CONNECTIVITY newConnectivity)
    {
        //Update network status
        UpdateNetworkStatus();          
    }

    /// <summary>
    /// Update our Network Status
    /// </summary>
    private void UpdateNetworkStatus()
    {
        //TODO: Test the following functions to get network and Internet status
        //iNetworkManager.NetworkListManager.IsConnectedToInternet
        //iNetworkManager.NetworkListManager.IsConnected
    }

Вот связанный вопрос: INetworkConnectionEvents Поддерживает что?

3 голосов
/ 06 ноября 2011

Я думаю, что диалоговое окно Microsoft, которое вы показываете выше, использует информацию, полученную при кодировании с помощью API осведомленности о сетевом расположении.

http://msdn.microsoft.com/en-us/library/ee264321%28v=VS.85%29.aspx

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