将win7Computer化身WiFi火热,让手提式有线电话机、台式机分享上网(设想有线路由卡塔尔(英语:State of Qatar)

2019-12-08 20:15栏目:bob体育平台
TAG:

  • 获得计算机连网状态
  • 赢得有线网络的时限信号强度

 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     }

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

风流倜傥台计算机,一时通过有线网连接网络(调制解调器/局域网),如有网卡也可一而再wifi。
那么怎么着拿到WLAN是还是不是连接,和呼应的功率信号强度呢?

返回值(bool)

  • 当重返值为true,且无不当Code时,表示互连网已接连
  • 当再次来到值为false,且无不当Code时,表示互联网未连接

那正是说,错误Code(相当)怎么获取呢?

2013.1.4心得

赢得有线网络的非确定性信号强度

收获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

 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);

图片 1

首先,增添非托管函数并调用,能够获取网络是还是不是联网

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

规定之后,提供分享的网卡Logo旁会师世“分享的”字样,表示“宽带连接”已分享至“虚构WiFi

 获取计算机连网状态

由此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 }

 

 推荐判别计算机接二连三网络的方案

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

答案是不是!

案例:

  1. 计算机配置了设想机连接--断网后,IsNetworkAlive重回的是有网true !-- 对设想机等网络是或不是连接无法看清。
  2. 在好几情状下,光纤等坏了,上不停网络,但是走TCP合同能够聊WechatQQ--IsNetworkAlive再次来到的是有网true !

无互联网时,有希望回到有网:lpdwFlags=1 局域网时,若是当前构造了设想机连接之类的,本机不能连接互联网时,IsNetworkAlive函数依然会重临true。如下:

图片 2

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

 收获系统的网络状态与有线网的能量信号强度(格数)

在“网络连接”窗口中,右键单击已一而再到Internet的网络连接,接收“属性”→“分享”,勾上“允许别的······连接(N卡塔尔(英语:State of Qatar)”并精选“虚构WiFi

互连网状态枚举值

一时半刻只定义了有线网和有线网的景观 

 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     }

那么,具体是不是无线/照旧有线互连网,怎样判断?见下边~

 

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);

key:有线网密码,三个以上字符(以wuminWiFi为例卡塔尔国。

就以下俩点:

 判定连网的不二法门介绍

 

输出值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(局域网)

图片 3

 

假造无线AP发射的WLAN是802.11g专门的学业,带宽为54Mbps

 2. IsNetworkAlive

急需劳务System Event Notification的援救(系统暗中同意自动运行该服务),且须要设置新型的SDK(如.NET)

浏览:MSDN对IsNetwork阿里ve的详细描述

由API中翻译:该功效可在Windows XP、二〇〇三(或Windows NT 4.0与Internet Explorer 5或越来越高版本卡塔尔(英语:State of Qatar)上行使,在windows95或更加高版本上接收Internet Explorer 5或越来越高版本。所以,平日的系统都以扶持的

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

卡塔尔国主机设置如下: 1、以处理人身份运转命令提醒符: 赶快键win+ENVISION输入cmd回车...

消除方法 :将防火墙展开

主机设置如下:

6.假若现身你输入 netsh wlan start hostedwork 回车时现身 无法加载

版权声明:本文由bob体育app发布于bob体育平台,转载请注明出处:将win7Computer化身WiFi火热,让手提式有线电话机、台式机分享上网(设想有线路由卡塔尔(英语:State of Qatar)