玉蒲团系列电影,超能陆战队电影下载,勉县一中
在看下文之前,可以浏览MSDN:
如上InternetGetConnectedState方法介绍中
bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);
首先,添加非托管函数并调用,可以获取网络是否联网
//声明外部的函数 [DllImport("winInet.dll ")] private static extern bool InternetGetConnectedState(ref int flag,int dwReserved);
需要服务System Event Notification的支持(系统默认自动启动该服务),且需要安装最新的SDK(如.NET)
浏览:
由API中翻译:该功能可在Windows XP、2000(或Windows NT 4.0与Internet Explorer 5或更高版本)上使用,在windows95或更高版本上使用Internet Explorer 5或更高版本。所以,一般的系统都是支持的
具体类型的详细内容可链接
无线网络的判断:lpdwFlags对是否无线网络,并没有直接的判断。
eg:比如我的电脑环境(有线网络或者wifi网络),获取的flag=1(局域网)
那么,错误Code(异常)怎么获取呢?
此处推荐使用Marshal中的GetLastWin32Error,见如下源代码:
1 /// <summary> 2 /// 通过使用平台调用的最后一个非托管函数返回的错误代码返回调用具有 <see cref="F:System.Runtime.InteropServices.DllImportAttribute.SetLastError" /> 标志设置。 3 /// </summary> 4 /// <returns>最后一个错误代码设置通过调用 Win32 SetLastError 函数。</returns> 5 [SecurityCritical] 6 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 7 [MethodImpl(MethodImplOptions.InternalCall)] 8 public static extern int GetLastWin32Error();
GetLastWin32Error可获取最后一个非托管函数的错误Code
int errCode = Marshal.GetLastWin32Error();
--获取 error code的详细描述信息,可参考
值得注意的是,非托管函数声明时,要添加SetLastError=true;如:
1 [DllImport("sensapi.dll", SetLastError = true)] 2 private static extern bool IsNetworkAlive(out int connectionDescription);
1 using (var ping = new Ping()) 2 { 3 //ping给定的host 如:www.baidu.com,超时时间为1s 4 var reply = ping.Send(host, 1000); 5 var pingResult= reply != null && reply.Status == IPStatus.Success; 6 }
如上,获取网络状态是否连接,建议通过IsNetworkAlive函数获取。那么IsNetworkAlive是否准确呢?
答案是否!
案例:
无网络时,有可能返回有网:lpdwFlags=1 局域网时,如果当前配置了虚拟机连接之类的,本机无法连接网络时,IsNetworkAlive函数还是会返回true。如下:
如果是局域网且IsNetworkAlive返回true,则使用InternetGetConnectedState重新获取网络状态。
1 //通过IsNetworkAlive方法,来获取电脑的联网状态 2 [DllImport("sensapi.dll", SetLastError = true)] 3 private static extern bool IsNetworkAlive(out int connectionDescription); 4 5 //通过InternetGetConnectedState方法,来获取电脑的联网状态 6 [DllImport("winInet.dll")] 7 private static extern bool InternetGetConnectedState(ref IntPtr dwFlag, int dwReserved); 8 9 /// <summary> 10 /// IsNetworkAlive函数输出值1-连接局域网 11 /// </summary> 12 private const int LanNetworkConnectedFlag = 1; 13 /// <summary> 14 /// 网络是否连接 15 /// </summary> 16 public static bool IsConnected 17 { 18 get 19 { 20 var isNetworkConnected = IsNetworkAlive(out int flags); 21 int errCode = Marshal.GetLastWin32Error(); 22 if (errCode != 0) 23 { 24 Console.WriteLine($"通过{nameof(IsNetworkAlive)}非托管DLL函数,获取网络状态时,遇到异常!"); 25 } 26 27 //IsNetworkAlive检测到是局域网连上网络,则使用InternetGetConnectedState重新确认是否有网 28 if (isNetworkConnected && flags == LanNetworkConnectedFlag) 29 { 30 var dwFlag = new IntPtr(); 31 isNetworkConnected = InternetGetConnectedState(ref dwFlag, 0); 32 errCode = Marshal.GetLastWin32Error(); 33 if (errCode != 0) 34 { 35 Console.WriteLine($"通过{nameof(InternetGetConnectedState)}非托管DLL函数,获取网络状态时,遇到异常!"); 36 } 37 } 38 39 return isNetworkConnected; 40 } 41 }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论