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

4
如何识别特定NetworkInterface的连接状态?
        NetworkInterface[] nets = NetworkInterface.GetAllNetworkInterfaces();

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

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

Windows 7具有此连接信息

2个回答

6
如上面的评论所提到的,您需要使用网络列表管理器,如这里所解释的那样。
首先,在Visual Studio解决方案中右键单击项目,选择添加>引用...。进入COM并使用搜索框找到“Network List Manager 1.0 Type Library”条目,然后将其添加为引用,如下面的屏幕截图所示。 Add Network List Manager Reference To Your Project 这将在二进制输出文件夹中生成一个名为Interop.NETWORKLIST.dll的Interop DLL以访问此COM接口。
在解决方案资源管理器中,您可以右键单击刚刚添加的NETWORKLIST引用,然后选择“在对象浏览器中查看”以检查您可以访问的接口。 enter image description here 从这里,您可以实现一个网络管理器类,如下所示,以订阅连接更改事件。
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);
        } 
    }
}

您可以像这样实例化您的网络管理器:
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 支持什么?


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - David says Reinstate Monica
这里是更详细的答案。希望我的回答这次不会被删除 :) - Slion

3

1
谢谢!在这里找到了一个C#教程,虽然这个库似乎是访问该功能的首选方式。请注意:1)尽管后者现在已经被放弃,但它仍然可能是访问NLM最方便的托管方式;2)NLM仅适用于Vista和Windows 7 :( - Cel
1
是的,您必须在Windows XP及以下版本中使用旧的NLA库,尽管它不提供与NLM相同水平的功能。 - rushman
先前评论中的指向WindowsAPICodePack的错误链接现在可以通过Nuget找到,使用 Install-Package WindowsAPICodePack-Core 或访问 https://www.nuget.org/packages/WindowsAPICodePack-Core/。 - Katstevens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接