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)
GetIsNetworkAvailable()不是解决方案OperationalStatus.Up可用于过滤掉一些不活动的网络接口,但不是全部 - OperationalStatus.Up在某些接口中显示 IPv4和IPv6的"无网络访问"UnicastAddresses,但那么有用的是什么?
作为在评论中提及上面你需要使用网络列表管理器解释有
为此,首先添加对它的引用,如下面的屏幕截图所示.在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支持什么?
| 归档时间: |
|
| 查看次数: |
3723 次 |
| 最近记录: |