[C#]使用InternetGetConnectedState API侦测目前电脑网络的连线状态

[C#]使用InternetGetConnectedState API侦测目前电脑网络的连线状态


有时候我们会有需要为程序加入侦测网络连线的能力,也许是当网络不通时秀些提示,或是将某些程序的功能给停用。这时我们可能会倾向采用NetworkChange.NetworkAddressChanged与NetworkChange.NetworkAvailabilityChanged这两个事件去侦测网络环境是否有所变动,或者用Timer加Ping的方式去侦测网络是否可以外连。上面两种方式在.NET程序中还算满常用的方法,但是以笔者的经验来说NetworkChange在多网卡环境下运行跟期望的可能会有所出入,而就算事件正常触发也可能需搭配其它方法侦测网络是否是通的,至于Ping的侦测方式,它需要实际的去送封包侦测,不仅需考虑可能会被封锁,也要考虑封包传送的额外负担,如果能直接跟系统询问连线状态一定会比较好一点。所以在做类似的功能时使用InternetGetConnectedState API可能也是一个不错的选择,这边随手将之稍微纪录一下。

要使用InternetGetConnectedState API侦测目前电脑网络的连线状态,首先我们必须要了解一下该API的函数原型。

  __out  LPDWORD lpdwFlags,
  __in   DWORD dwReserved
);

从函数原型我们可以看出该API需要两个参数,一个是带入来回传目前网络连线类型的,回传的值可参阅下表:

image

另一个则是API保留的参数,直接带入0就可以了。至于该API的回传值则是代表电脑网络是否是连线的状态。

函数原型跟用法都清楚后,我们可以开始实际的使用API,首先为程序加入API的PInvoke声明:

扫描二维码关注公众号,回复: 7247078 查看本文章

		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。

image

Link

  • InternetGetConnectedState function
  • InternetGetConnectedState | 男丁格尔's 脱壳玩

原文:大专栏  [C#]使用InternetGetConnectedState API侦测目前电脑网络的连线状态


猜你喜欢

转载自www.cnblogs.com/petewell/p/11496008.html