微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

特定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的这些部分我找不到任何相关的东西

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

如何在不使用环境枚举的情况下以编程方式解决环境variables?

FileLogTraceListener发送System.IO.Exceptions

如何检测系统时间是否更改? (来自.net)

Windows从多图标文件中select错误的图标,并自我渲染以更正大小

一个线程可以在临界区中被抢占吗?

我认为上面显示的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支持什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐