[C#]使用InternetGetConnectedState API侦测目前电脑网络的连线状态
有时候我们会有需要为程序加入侦测网络连线的能力,也许是当网络不通时秀些提示,或是将某些程序的功能给停用。这时我们可能会倾向采用NetworkChange.NetworkAddressChanged与NetworkChange.NetworkAvailabilityChanged这两个事件去侦测网络环境是否有所变动,或者用Timer加Ping的方式去侦测网络是否可以外连。上面两种方式在.NET程序中还算满常用的方法,但是以笔者的经验来说NetworkChange在多网卡环境下运行跟期望的可能会有所出入,而就算事件正常触发也可能需搭配其它方法侦测网络是否是通的,至于Ping的侦测方式,它需要实际的去送封包侦测,不仅需考虑可能会被封锁,也要考虑封包传送的额外负担,如果能直接跟系统询问连线状态一定会比较好一点。所以在做类似的功能时使用InternetGetConnectedState API可能也是一个不错的选择,这边随手将之稍微纪录一下。
要使用InternetGetConnectedState API侦测目前电脑网络的连线状态,首先我们必须要了解一下该API的函数原型。
__out LPDWORD lpdwFlags,
__in DWORD dwReserved
);
从函数原型我们可以看出该API需要两个参数,一个是带入来回传目前网络连线类型的,回传的值可参阅下表:
另一个则是API保留的参数,直接带入0就可以了。至于该API的回传值则是代表电脑网络是否是连线的状态。
函数原型跟用法都清楚后,我们可以开始实际的使用API,首先为程序加入API的PInvoke声明:
public static extern bool InternetGetConnectedState(
ref uint lpdwFlags,
uint dwReserved
);
使用时就先声明个用来回传的参数,然后将声明的参数与0带入该API中即可。
uint flags = 0x0;
var isNetworkAvailable = InternetGetConnectedState(ref flags, 0);
...
最后这边附上一个比较完整的使用范例:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication21
{
class Program
{
[DllImport("wininet")]
public static extern bool InternetGetConnectedState(
ref uint lpdwFlags,
uint dwReserved
);
static void Main(string[] args)
{
uint flags = 0x0;
var isNetworkAvailable = InternetGetConnectedState(ref flags, 0);
Console.WriteLine(string.Format("Network available: {0} ({1})", isNetworkAvailable.ToString(), flags.ToString()));
}
}
}
运行后可以看到如下的画面,代表笔者的电脑目前是有网络连线的,而且网络的连线状态是INTERNET_RAS_INSTALLED & INTERNET_CONNECTION_LAN。
Link
- InternetGetConnectedState function
- InternetGetConnectedState | 男丁格尔's 脱壳玩
原文:大专栏 [C#]使用InternetGetConnectedState API侦测目前电脑网络的连线状态