www.9778.com 4

获取系统的网络状态与无线网的信号强度(格数)

就以下俩点:

输出值lpdwFlags

具体类型的详细内容可链接QOCINFO
structure.aspx)

  • NETWORK_ALIVE_LAN=1 局域网(此处并非指有线网)
  • NETWORK_ALIVE_WAN=2
    远程访问-拨号访问和vpn访问(此处并非只无线网,按DPI所示,指的是RAS
    connections)
  • NETWORK_ALIVE_AOL=4
    无效的值。。。因为只有Win9x系统才有此第三个选项。参考链接

无线网络的判断:lpdwFlags对是否无线网络,并没有直接的判断。

eg:比如我的电脑环境(有线网络或者wifi网络),获取的flag=1(局域网)

www.9778.com 1

 

确定之后,提供共享的网卡图标旁会出现“共享的”字样,表示“宽带连接”已共享至“虚拟WiFi

1、检查无线开关是否打开。如果是使用笔记本电脑连接无线信号,则笔记本通常有快捷无线开关,用“Fn”+快捷键打开,另外有些笔记本还有硬性开关在笔记本周围,需要用手拨一下打开。如果是手机,则检查手机上是否启动了WLAN。

一台电脑,有时通过有线网连接网络(调制解调器/局域网),如有网卡也可连接wifi。
那么如何获取WLAN是否连接,和相应的信号强度呢?

 1. InternetGetConnectedState

  • 此函数获取网络状态有延时,且对网卡伤害较大
  • MSDN官方自己推荐不建议使用,不管是连网状态下还是断网情况下,获取的网络状态都有不准确的案例,如下:

  (BUG) InternetGetConnectedState API returns false
result

  Detecting LAN connection using InternetGetConnectedState API
doesn’t
work

  

  

在看下文之前,可以浏览MSDN:通过InternetGetConnectedState方法对网络状态的获取.aspx)

如上InternetGetConnectedState方法介绍中

  • dwReversed必须设置为0
  • 通过输出值lpdwFlags可以获取当前网络连接的信息,通过拼装对比可以得到当前连接的网络类型,如拨号上网/局域网等

    bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);

www.9778.com 2

首先,添加非托管函数并调用,可以获取网络是否联网

//声明外部的函数
[DllImport("winInet.dll ")]
private static extern bool InternetGetConnectedState(ref int flag,int dwReserved);

至此,虚拟WiFi的红叉叉消失,WiFi基站已组建好,主机设置完毕。笔记本、带WiFi模块的手机等子机搜索到无线网络wuminPC,输入密码wuminWiFi,就能共享上网啦!

接着我们点击下方这个wlan
autoconfig,假如没有用,就需要重新启动下这个,如图所示。

获取无线网络的信号强度

获取WLAN的名称与信号强度

无线网的信息,可以通过第三方开源ManagedWifi来获取。

ManagedWifi.Dll也可以从我的云盘下载:
密码:2d2o

下载后引用到项目中

  1. WlanClient wlanClient = new WlanClient();

  2. 循环foreach(WlanClient.WlanInterface wlanIface in
    wlanClient.Interfaces)

  3. Wlan.WlanAvailableNetwork[] networks =
    wlanIface.GetAvailableNetworkList(0);

值得注意的是,

  • WlanClient只在有网卡的系统中能初始化–所以如果WlanClient不能初始化,且IsNetworkAlive返回true,则意味着当前是有线连接网线
  • WlanInterfacer的GetAvailableNetworkList方法,获取的是附近wifi热点列表,和任务栏下热点列表的顺序无关。
  • WlanAvailableNetwork的wlanSignalQuality信号强度,100以内,如要转换成信号格数,需要整除25
  • profileName,对已连接的热点profileName显示完整,未连接的热点profileName为empty.

获取无线网连接状态:

 1 private NetworkStatus GetWlanStatus()
 2 {
 3     var wlanStatus = NetworkStatus.WifiWithErro;
 4     try
 5     {
 6         WlanClient wlanClient = new WlanClient();
 7 
 8         foreach (WlanClient.WlanInterface wlanIface in wlanClient.Interfaces)
 9         {
10             if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected)
11             {
12                 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
13                 foreach (var network in networks)
14                 {
15                     if (network.profileName == wlanIface.CurrentConnection.profileName
16                         && (int)network.flags == (int)(Wlan.WlanAvailableNetworkFlags.Connected | Wlan.WlanAvailableNetworkFlags.HasProfile))
17                     {
18                         switch (network.wlanSignalQuality / 25)
19                         {
20                             case 0:
21                                 wlanStatus = NetworkStatus.WifiWithOneBar;
22                                 break;
23                             case 1:
24                                 wlanStatus = NetworkStatus.WifiWithTwoBars;
25                                 break;
26                             case 2:
27                                 wlanStatus = NetworkStatus.WifiWithThreeBars;
28                                 break;
29                             default:
30                                 wlanStatus = NetworkStatus.WifiWithFourBars;
31                                 break;
32                         }
33                         break;
34                     }
35                 }
36                 break;
37             }
38         }
39     }
40     catch (Exception e)
41     {
42     }
43     return wlanStatus;
44 }

 

关键字:网络连接状态NetworkStatus,无线网络强度(格数),ManagedWifi,IsNetworkAlive,GetLastError

 判断连网的方法介绍

解决方法 :将防火墙打开

3、排除法。使用其它终端设备连接该路由器无线信号,如果能够连接上,则说明此路由器及无线信号均没有问题。

 获取电脑连网状态

通过IsNetworkAlive可获取当前环境是否已经连接网络。详见《C#
获取电脑的网络连接状态》

获取系统的网络状态与无线网的信号强度(格数)。流程:网络是否连接->是否有无线网连接->获取无线网状态(信号强度)->返回网络状态

 1 [DllImport("sensapi.dll", SetLastError = true)]
 2 private static extern bool IsNetworkAlive(out int connectionDescription);
 3 public NetworkStatus GetNetworkStatusByNetworkAlive()
 4 {
 5     var networkStatus = NetworkStatus.InternetWithError;
 6 
 7     int flags = 0;
 8     var isNetworkAlive = IsNetworkAlive(out flags);
 9 
10     int errCode = Marshal.GetLastWin32Error();
11     if (errCode != 0)
12     {
13         throw new InvalidOperationException($"通过{nameof(IsNetworkAlive)}非托管DLL,获取网络状态时,遇到异常");
14     }
15     if (isNetworkAlive)
16     {
17         // 获取WLAN网络状态
18         var wlanStatus = GetWlanStatus();
19         if (isNetworkAlive && wlanStatus == NetworkStatus.WifiWithErro)
20         {
21             networkStatus = NetworkStatus.Internet;
22         }
23         else
24         {
25             networkStatus = wlanStatus;
26         }
27     }
28     return networkStatus;
29 }

 

3. 获取上一次异常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的详细描述信息,可参考

值得注意的是,非托管函数声明时,要添加SetLastError=true;如:

1 [DllImport("sensapi.dll", SetLastError = true)]
2 private static extern bool IsNetworkAlive(out int connectionDescription);

以上三个参数可以单独使用,例如只使用mode=disallow可以直接禁用虚拟Wifi网卡。

03

网络状态枚举值

暂时只定义了有线网和无线网的状态 

 1     /// <summary>
 2     /// 网络状态
 3     /// </summary>
 4     public enum NetworkStatus
 5     {
 6         Internet,
 7         InternetWithError,
 8         WifiWithErro,
 9         WifiWithOneBar,
10         WifiWithTwoBars,
11         WifiWithThreeBars,
12         WifiWithFourBars,
13     }

那么,具体是否有线/还是无线网络,如何判断?见下面~

 

返回值(bool)

  • 当返回值为true,且无错误Code时,表示网络已连接
  • 当返回值为false,且无错误Code时,表示网络未连接

那么,错误Code(异常)怎么获取呢?

快捷键win+R→输入cmd→回车

大家好我是小军,希望我的回答能帮助大家!可能的原因及解决办法如下:

  • 获取电脑连网状态
  • 获取无线网络的信号强度

 推荐判断电脑连接网络的方案

如上,获取网络状态是否连接,建议通过IsNetworkAlive函数获取。那么IsNetworkAlive是否准确呢?

答案是否!

案例:

  1. 电脑配置了虚拟机连接–断网后,IsNetworkAlive返回的是有网true !–
    对虚拟机等网络是否连接不能判断。
  2. 在某些情况下,光纤等坏了,上不了网络,但是走TCP协议可以聊微信QQ–IsNetworkAlive返回的是有网true
    !

无网络时,有可能返回有网:lpdwFlags=1
局域网时,如果当前配置了虚拟机连接之类的,本机无法连接网络时,IsNetworkAlive函数还是会返回true。如下:

www.9778.com 3

 
所以,如果是局域网且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     }

 获取系统的网络状态与无线网的信号强度(格数)

(将start改为stop即可关闭该无线网,以后开机后要启用该无线网只需再次运行此命令即可)

重新启动后,我们在重新启动下电脑。

 2. IsNetworkAlive

需要服务System Event
Notification的支持(系统默认自动启动该服务),且需要安装最新的SDK(如.NET)

浏览:MSDN对IsNetworkAlive的详细描述

由API中翻译:该功能可在Windows XP、2000(或Windows NT 4.0与Internet
Explorer 5或更高版本)上使用,在windows95或更高版本上使用Internet
Explorer 5或更高版本。所以,一般的系统都是支持的

2013.1.4心得

2、检查系统设置。查看网络连接,如果无线被禁用了,右击选择打开无线网络。此外,还应检查系统或安全软件是否禁用了无线网卡。

 4. 使用Ping函数

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     }

 

3、检查周围环境。把路由器和无线终端设备如电脑放在无线信号强度的有效距离内。

虚拟无线AP发射的WLAN是802.11g标准,带宽为54Mbps

1、检查无线信号灯。如果无线状态指示灯(WLAN灯或WIFI灯)恒亮或闪亮,则表示无线信号发射正常。如不亮,则登录路由器进行设置或检查路由器是否损坏。

)
主机设置如下: 1、以管理员身份运行命令提示符:
快捷键win+R输入cmd回车…

常亮表示端口与前端猫连接正常。当有数据传输,比如有设备在上网的时候(电脑百事网
PC841.Com),正常情况就会数据传输,传输过程中,WLAN端口就会不断的闪烁。

3、设置Internet连接共享:

2、SYS系统指示灯

主机设置如下:

接着我们双击服务打开,在出现的界面中找到wired autoconfig和wlan
autoconfig,如图所示。

 

二、检查无线终端设备是否正常。

 

04

4、开启无线网络:

手机搜不到wifi信号

在电脑右下角“打开网络中心与共享”->”更改适配置设置”->右键”本地宽带”->“属性”->主要:家庭网络连接:虚拟wifi

接着我们按“服务和应用程序”,如图所示。

解决方法 : 将你电脑的无线网络端口指示灯打开(一般是
Fn+F快捷键【根据你的电脑,可以查看是怎么开启的】)

3、检查周围环境。把路由器和无线终端设备如电脑放在无线信号强度的有效距离内。

将win7电脑变身WiFi热点,让手机、笔记本共享上网(虚拟无线路由)

要么坏了要么隐藏网络名称

 

01

继续在命令提示符中运行:netsh wlan start hostednetwork

问:路由器灯正常亮为什么搜不到信号?

运行命令:netsh wlan set hostednetwork mode=allow ssid=wuminPC
key=wuminWiFi(12345678)

2、检查系统设置。查看网络连接,如果无线被禁用了,右击选择打开无线网络。此外,还应检查系统或安全软件是否禁用了无线网卡。

在“网络连接”窗口中,右键单击已连接到Internet的网络连接,选择“属性”→“共享”,勾上“允许其他······连接(N)”并选择“虚拟WiFi

使用其他电子设备连接同一个wifi,如故障依旧,将无线路由器断电几分钟重启或是恢复出厂设置重新设置上网参数,创建wifi;

2、启用并设定虚拟WiFi网卡:

3、检查周围环境。把路由器和无线终端设备如电脑放在无线信号强度的有效距离内。

附:显示无线网络信息命令:netsh wlan show hostednetwork

喜欢记得点个关注哦(´-ω-`)谢谢大家!

5.如果在需要共享的宽带连接->属性->共享中
出现大概意思是“共享不可用,出现错误是0x8000500”

1、有可能是手机用久了出现故障,先关闭手机wifi功能再重新打开搜索,或者重启手机.

6.如果出现你输入 netsh wlan start hostedwork 回车时出现 无法加载

二、检查无线终端设备是否正常。

 

1、电源指示灯

开启成功后,网络连接中会多出一个网卡为“Microsoft Virtual WiFi Miniport
Adapter”的无线连接2,为方便起见,将其重命名为虚拟WiFi。若没有,只需更新无线网卡驱动就OK了。

接着就可以搜索到无线网络信号了。

此命令有三个参数,mode:是否启用虚拟WiFi网卡,改为disallow则为禁用。

三、故障排除检查参考如下:

 

一、检查路由器无线信号是否正常。

1、以管理员身份运行命令提示符:

检查各个设备之间的网线连接是否正常,接触是否松动,建议重新拔插一次;

key:无线网密码,八个以上字符(以wuminWiFi为例)。

二、检查无线终端设备是否正常。

www.9778.com, 

05

ssid:无线网名称,最好用英文(以wuminPC为例)。

因此,一般路由器正常至少亮2个灯,最重要的是电源指示灯、WAN指示灯,至于LAN指示灯、SYS系统指示灯要看情况,比如很多路由器都取消了这个SYS系统指示灯,而LAN口是连接网线的接口,只有电脑通过网线与路由器连接,通过有线上网,LAN口才会常亮,有数据传输会闪烁。

www.9778.com 4

接着点击“服务”,如图所示。

二、检查无线终端设备是否正常。

跳过无线路由器modem直接连接电脑宽带拨号上网,如故障,致电当地网络运营商进行网络故障报修;

操作方法如图所示

路由器指示灯通常可以分为4类,分别是电源指示灯、SYS系统指示灯、LAN指示灯、WAN指示灯,这四个指示灯含义如下:

3、排除法。使用其它终端设备连接该路由器无线信号,如果能够连接上,则说明此路由器及无线信号均没有问题。

很高兴回答你的问题。看图操作。希望我提供的东西能帮到你。

08

打开我的电脑,右键点击,在出现的界面中点击“管理”,如图所示。

2、路由器重新启动或者重置路由器数据

3、LAN指示灯

一、检查路由器无线信号是否正常。

这个指示灯是电源联通电源的指示灯,正常工作必须常亮,不亮说明电源没插好或者路由器坏了。

2、检查路由器无线设置。登录路由器后,检查无线设置中是否“开启无线功能”和“开启SSID广播”,以及SSID号是否存在不合适的字母符号。检查是否设置了隐蔽WIFI信号,如果设置了也是搜不到信号的哦!看看是否设置了中文的wifi名称!具体看下图2、图3!

02

3、排除法。使用其它终端设备连接该路由器无线信号,如果能够连接上,则说明此路由器及无线信号均没有问题。

可能的原因及解决办法如下:

3、检查周围环境。把路由器和无线终端设备如电脑放在无线信号强度的有效距离内。

2、宽带接入要正常,外部插入路由器的网线进线接口必须常亮,也就是WAN口必须常亮,有数据传输则为常亮闪烁;

WAN指示灯显示的是外部宽带线信号指示灯。

如其他电子设备可正常联网,modem可正常拨号上网,则可能为连接端电子设备的问题,手机建议关机重启,电脑检查网卡驱动是否正常。

2、检查路由器无线设置。登录路由器后,检查无线设置中是否“开启无线功能”和“开启SSID广播”,以及SSID号是否存在不合适的字母符号。

LAN接口是与电脑连接的,如果将网线将此接口和电脑的网卡接口连接,开启电脑后,LAN指示灯是会亮的,如果不亮说明接口或者网线出现问题。接口问题可能是路由器接口或者电脑网卡接口问题。

1、检查无线开关是否打开。如果是使用笔记本电脑连接无线信号,则笔记本通常有快捷无线开关,用“Fn”+快捷键打开,另外有些笔记本还有硬性开关在笔记本周围,需要用手拨一下打开。如果是手机,则检查手机上是否启动了WLAN。

可能的原因及解决办法如下:

1、路由器要正常工作,首先“电源指示灯必须是常亮”,如果路由器还有SYS系统指示灯的话,这个需要常亮(如今很多新路由器都取消了SYS系统指示灯,一般电源灯正常,说明路由器就是开机运行状态);

一、检查路由器无线信号是否正常。

开关从启动一下

1、检查无线信号灯。如果无线状态指示灯(WLAN灯或WIFI灯)恒亮或闪亮,则表示无线信号发射正常。如不亮,则登录路由器进行设置或检查路由器是否损坏。

我们先点击第一个wired autoconfig,在上方可以点击启动该服务,如图所示。

主流路由器已经将电源指示灯与SYS指示灯合二为一

一、检查路由器无线信号是否正常。

1、检查无线信号灯。如果无线状态指示灯(WLAN灯或WIFI灯)恒亮或闪亮,则表示无线信号发射正常。如不亮,则登录路由器进行设置或检查路由器是否损坏。

路由器正常亮几个灯?

07

3、排除法。使用其它终端设备连接该路由器无线信号,如果能够连接上,则说明此路由器及无线信号均没有问题。

因此,对于路由器用户来说,最重要的主要是看WAN口,这个关乎宽带接入是否正常。如果WAN指示灯不亮,则说明猫或者外部网线有问题,如果WAN指示灯亮但不闪烁,说明宽带线路没有问题,但没有数据传输,这种情况可能是运营商的宽带线路临时出了问题,建议等等或者拨打运营商客服电话咨询网络问题,确认是否宽带线路出现故障。

1、检查无线开关是否打开。如果是使用笔记本电脑连接无线信号,则笔记本通常有快捷无线开关,用“Fn”+快捷键打开,另外有些笔记本还有硬性开关在笔记本周围,需要用手拨一下打开。如果是手机,则检查手机上是否启动了WLAN。

2、检查系统设置。查看网络连接,如果无线被禁用了,右击选择打开无线网络。此外,还应检查系统或安全软件是否禁用了无线网卡。

4、WAN指示灯

2、检查路由器无线设置。登录路由器后,检查无线设置中是否“开启无线功能”和“开启SSID广播”,以及SSID号是否存在不合适的字母符号。

3、LAN口属于通过电脑与路由器通过网线连接的接口,如果通过网线连接电脑上网,在正常网络传输下LAN口也是常亮并闪烁的。如果没有通过网线与路由器连接,通过的是无线上网,则LAN口是不亮的。

1、检查无线信号灯。如果无线状态指示灯(WLAN灯或WIFI灯)恒亮或闪亮,则表示无线信号发射正常。如不亮,则登录路由器进行设置或检查路由器是否损坏。具体展示在页面后面图1!

1、检查无线开关是否打开。如果是使用笔记本电脑连接无线信号,则笔记本通常有快捷无线开关,用“Fn”+快捷键打开,另外有些笔记本还有硬性开关在笔记本周围,需要用手拨一下打开。如果是手机,则检查手机上是否启动了WLAN。

2、检查路由器无线设置。登录路由器后,检查无线设置中是否“开启无线功能”和“开启SSID广播”,以及SSID号是否存在不合适的字母符号。

搜索不到路由,那就用其它的设备搜索试试,如果都是找不到无线WIFI,那就用电脑进路由设置中看是不是关了无线,重启或是重新设置一次路由,问题不能解决就换路由试。

换个新的路由器

这个SYS系统指示灯是路由器的工作状态指示灯,闪烁代表正常,如果SYS系统指示灯不亮或者会亮,但不会闪烁,那么基本是路由器出现问题了。

2、检查系统设置。查看网络连接,如果无线被禁用了,右击选择打开无线网络。此外,还应检查系统或安全软件是否禁用了无线网卡。

06