特定networking接口IPv4可用性 – 无连接,本地,Internet

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

  NetworkInterface[] nets = NetworkInterface.GetAllNetworkInterfaces(); foreach (var n in nets) { // TODO: determine connectivity status of each network interface // ( mainly interested in IPv4 connectivity ) } 
  • 这个问题不是关于一般的互联网连接 ,因此使用GetIsNetworkAvailable()不是一个解决scheme
  • OperationalStatus.Up可以用来过滤一些不活动的networking接口,但不是全部 – OperationalStatus.Up在一些显示“无networking访问”的IPv4和IPv6接口
  • 我也知道如何获得IPv4 UnicastAddresses ,但那么有用的是什么?
  • 在WMI的这些部分我找不到任何相关的东西

即提取每个接口状态为互联网,本地,有限或无

Windows 7有这个连接信息

Solutions Collecting From Web of "特定networking接口IPv4可用性 – 无连接,本地,Internet"

我认为上面显示的Microsoft对话框是使用通过对网络位置感知API进行编码获得的信息。

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

正如在上面的评论中提到的,您需要使用网络列表管理器

要做到这一点,首先添加一个引用,如下面的截图所示。 在您的Visual Studio解决方案中右键单击您的项目。 选择添加>参考…转到COM并使用搜索框找到“网络列表管理器1.0类型库”条目。

将网络列表管理器引用添加到您的项目

这将在您的二进制输出文件夹中为此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支持什么?