获取网络连接状态(二) IsNetworkAlive
IsNetworkAlive需要服务System Event Notification的支持(系统默认自动启动该服务),且需要安装最新的SDK(如.NET)
由API中翻译:该功能可在Windows XP、2000(或Windows NT 4.0与Internet Explorer 5或更高版本)上使用,在windows95或更高版本上使用Internet Explorer 5或更高版本。所以,一般的系统都是支持的
输出值lpdwFlags
具体类型的详细内容可链接QOCINFO structure
- NETWORK_ALIVE_LAN=1 局域网(此处并非指有线网)
- NETWORK_ALIVE_WAN=2 远程访问-拨号访问和vpn访问(此处并非只无线网,按DPI所示,指的是RAS connections)
- NETWORK_ALIVE_AOL=4 无效的值。。。因为只有Win9x系统才有此第三个选项。参考链接
无线网络的判断:lpdwFlags对是否无线网络,并没有直接的判断。
eg:比如我的电脑环境(有线网络或者wifi网络),获取的flag=1(局域网)

返回值(bool)
- 当返回值为true,且无错误Code时,表示网络已连接
- 当返回值为false,且无错误Code时,表示网络未连接
那么,错误Code(异常)怎么获取呢?
获取上一次异常Code-GetLastError
此处推荐使用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的详细描述信息,可参考https://my.oschina.net/kavensu/blog/264273
值得注意的是,非托管函数声明时,要添加SetLastError=true;如:
1 [DllImport("sensapi.dll", SetLastError = true)]
2 private static extern bool IsNetworkAlive(out int connectionDescription);
网络状态准确性
IsNetworkAlive电脑网络判断不准确,案例:
- 电脑配置了虚拟机连接--将当前的以太网禁用后,IsNetworkAlive返回的是有网true -- 将虚拟机的本地网络适配器当成了可用的网络连接,但是电脑其实是没有网络的
- 在某些情况下,光纤等坏了,上不了网络,但是走TCP协议可以聊微信QQ,IsNetworkAlive返回的也是有网true
IsNetworkAlive对网络类型判断也不准确,虽然可以通过lpdwFlags枚举值判断网络类型。
无网络时,有可能返回有网:lpdwFlags=1 局域网时,如果当前配置了虚拟机连接之类的,本机无法连接网络时,IsNetworkAlive函数还是会返回true。如下:

所以,IsNetworkAlive仅可使用简单场景下的网络判断
获取网络连接状态(二) IsNetworkAlive的更多相关文章
- Android编程 获取网络连接状态 及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Android编程获取网络连接状态及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用 ...
- android 检查网络连接状态实现步骤
获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.AC ...
- Windows Phone 8 获取与监听网络连接状态(转)
原文地址:http://www.cnblogs.com/sonic1abc/archive/2013/04/02/2995196.html 现在的只能手机对网络的依赖程度都很高,尤其是新闻.微博.音乐 ...
- Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口
1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...
- [android] android 获取网络连接信息
效果图: 工具类 /** * 获取网络连接信息 * * 根据NetworkInfo可以知道有很多的连接方式和信息 * * ① 当没有任何可用网络的时候,networkinfo为null 判断netw ...
- Win8 app判断网络连接状态
Win8 app判断网络连接状态 NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged; ...
随机推荐
- jieba原理
一.jieba介绍jieba库是一个简单实用的中文自然语言处理分词库. jieba分词属于概率语言模型分词.概率语言模型分词的任务是:在全切分所得的所有结果中求某个切分方案S,使得P(S)最大. ji ...
- day48-Mysql安装文件结构及SQL常用语句
1.安装文件结构 bin--mysql.exe 客户端运行程序: mysqld.exe 服务端运行程序: data--数据库.数据表等文件 注:修改配置文件后需要重启服务端 2.常用SQL语句 1) ...
- JUC学习!
JUC 1.what? JUC就是java.util.concurrent下面的类包,专门用于多线程的开发. 2.why? 解决多线程.高并发 3.how? || || ﹀ point1:vola ...
- scrapy框架中的pipelines没有成功调用process_item方法
提示报错 原因: items没有接收到Spider的返回值,导致pipelines没有接收到items模块的返回值,检查Spider模块是否正确返回值,我这里的原因是,数据解析完成后没有yield i ...
- Unity_飞机大战记录总结
记录步骤:win+R→PSR.exe 一.竖屏设置 分辨率设为9:16 二.主控脚本 添加一个空节点,命名"游戏主控" 新建游戏的主控脚本,命名为MyGame.cs,方便管理(即, ...
- POI给单元格添加超链接(xls,xlsx)
package com.topcheer.html; import java.io.FileOutputStream; import java.io.IOException; import org.a ...
- Echarts的安装和使用
安装步骤 下载相关文件 可以在该网站下载Echarts.js文件,网址在此:https://www.echartsjs.com/zh/builder.html 然后选择号自己需要用到的图形模块,点击下 ...
- Docker教程、架构、资源
一.Docker教程 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...
- 最简单的for循环语句
前言 在前面的文章中,壹哥给大家讲解了顺序结构.分支结构,接下来我们就来学习Java里的循环结构.Java里的循环结构,可以通过while.do-while.for.foreach等方式进行实现,今天 ...
- JS有哪些变态语法,你知道吗?
JS作为一门如此灵活的语言,自然在编码时给我们带来了很多方便,但方便的同时,也衍生出了很多变态的语法,下面我们来梳理一些常见的变态语法,希望你下次在某位大牛的代码中看到这样的东西,不要惊掉下巴. NO ...