【问题标题】:Specific network interface IPv4 availability - No connectivity, Local, Internet特定网络接口 IPv4 可用性 - 无连接、本地、互联网
【发布时间】:2011-11-06 14:45:44
【问题描述】:

如何识别特定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

【问题讨论】:

    标签: c# .net windows winapi networking


    【解决方案1】:

    正如上面评论中提到的,您需要按照there 的说明使用网络列表管理器

    为此,首先添加对其的引用,如下面的屏幕截图所示。 在 Visual Studio 解决方案中右键单击您的项目。选择 Add > Reference... 转到 COM 并使用搜索框找到“Network List Manager 1.0 Type Library”条目。

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

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

    您可以从这里实现如下所示的网络管理器类来订阅连接更改事件。

    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 Supports what?

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 这是一个更广泛的答案。我希望这次我的答案不会被删除:)
    【解决方案2】:

    我认为您在上面显示的 Microsoft 对话框使用的是通过对 Network Location Awareness API 进行编码获得的信息。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2017-05-23
    相关资源
    最近更新 更多