加上非托管函数并调用

 剖断连网的法门介绍

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

 2. IsNetworkAlive

急需服务System 伊夫nt
Notification的支撑(系统私下认可自动运维该服务),且须求安装新型的SDK(如.NET)

浏览:MSDN对IsNetworkAlive的详细描述

由API中翻译:该意义可在Windows XP、三千(或Windows NT 4.0与Internet
Explorer 5或越来越高版本)上运用,在windows95或越来越高版本上行使Internet
Explorer 5或越来越高版本。所以,平时的连串都以支撑的

输出值lpdwFlags

具体项指标亲力亲为内容可链接QOCINFO
structure.aspx)

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

有线网络的论断:lpdwFlags对是还是不是有线网络,并从未一贯的推断。

eg:比方本人的微管理器情形(有线网络大概wifi网络),获取的flag=1(局域网)

图片 2

 

返回值(bool)

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

那么,错误Code(格外)怎么获取呢?

3. 赢得上一次不行Code-GetLastError

参照他事他说加以考察链接

这里推荐使用马尔斯hal中的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);

 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     }

 推荐判别Computer一而再网络的方案

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

答案是还是不是!

案例:

  1. 计算机配置了设想机连接–断网后,IsNetworkAlive重回的是有网true !–
    对虚构机等网络是还是不是连接无法看清。
  2. 在好几境况下,光导纤维等坏了,上每每互联网,可是走TCP公约可以聊微信QQ–IsNetworkAlive重返的是有网true
    !

无互联网时,有望回到有网:lpdwFlags=1
局域网时,要是当前铺排了虚构机连接之类的,本机不能够连接互联网时,IsNetworkAlive函数依然会回到true。如下:

图片 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     }

 猎取系统的互联网状态与有线网的随机信号强度(格数)

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website