特定网络接口IPv4可用性 - 无连接,本地,Internet

Cel*_*Cel 4 .net c# windows networking winapi

如何识别特定的连接状态NetworkInterface

        NetworkInterface[] nets = NetworkInterface.GetAllNetworkInterfaces();

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

即每个接口状态提取为Internet,Local,Limited或None

Windows 7具有此连接信息

Sli*_*ion 5

作为在评论中提及上面你需要使用网络列表管理器解释

为此,首先添加对它的引用,如下面的屏幕截图所示.在Visual Studio解决方案中右键单击您的项目.选择添加>参考...转到COM并使用搜索框找到"网络列表管理器1.0类型库"条目.

将网络列表管理器参考添加到您的项目

这将在二进制输出文件夹中为此COM接口生成一个Interop DLL.该DLL名为Interop.NETWORKLIST.dll.

在解决方案资源管理器中,您可以右键单击刚刚添加的NETWORKLIST引用,然后选择"在对象浏览器中查看"以检查您可以访问的接口.

在此输入图像描述

从这里,您可以实现如下所示的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);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样实例化您的网络管理器:

iNetworkManager = new NetworkManager();
iNetworkManager.OnConnectivityChanged += OnConnectivityChanged;
Run Code Online (Sandbox Code Playgroud)

收到连接更改事件后,您可以测试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
    }
Run Code Online (Sandbox Code Playgroud)

这是一个相关的问题: INetworkConnectionEvents支持什么?