认清互连网是不是连接

输出值lpdwFlags

具体品种的详实内容可链接QOCINFO structure.aspx)

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

eg:比如自个儿的Computer情况(有线互连网或许wifi网络),获取的flag=1(局域网)

图片 1

 

Delphi中尚无对这一个函数举办宣示,所以大家要和睦注脚,请把下部的代码参加到当前窗体恐怕单元的 注脚全局变量的地点也正是第七个var上面。

 剖断连网的点子介绍

上边再介绍四个方式能够看清网络是还是不是衔接的。

 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     }

Function IsNetworkAlive(varlpdwFlagsLib:Integer):Integer;stdcall;external'SENSAPI.DLL';

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

Delphi中绝非对该函数举行宣示,所以大家要自身申明,那跟上边的第二种方法的注解是同个所以然
函数注明为:
functionInetIsOffline(Flag: Integer): Boolean;stdcall; external 'URL.DLL';

 1. InternetGetConnectedState

  (BUG) InternetGetConnectedState API returns false result

  Detecting LAN connection using InternetGetConnectedState API doesn't work

  

  

在看下文以前,能够浏览MSDN:透过InternetGetConnectedState方法对互联网状态的拿走.aspx)

如上InternetGetConnectedState方法介绍中

图片 2

先是,加多非托管函数并调用,能够得到网络是否联网

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

以上就是经过接纳InternetGetConnectedState函数完毕的判断网络状态的格局

 推荐判定Computer一连互联网的方案

如上,获取互联网状态是还是不是连接,提议通过IsNetworkAlive函数获取。那么IsNetworkAlive是还是不是可靠吗?

答案是还是不是!

案例:

  1. Computer配置了设想机连接--断网后,IsNetworkAlive再次来到的是有网true !-- 对设想机等网络是或不是连接无法判断。
  2. 在好几处境下,光导纤维等坏了,上连发互连网,不过走TCP协议得以聊WechatQQ--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     }

 获得系统的互连网状态与无线网的时限信号强度(格数)

Const NETWORK_ALIVE_LAN =1;  //通过局域英特网网
ConstNETWORK_ALIVE_WAN = 2;  //通过广域英特网网
ConstNETWORK_ALIVE_AOL = 4;  //仅对98/95立见成效决断是还是不是联上美利哥网络

返回值(bool)

那么,错误Code(极度)怎么获取呢?

uses wininet;//这些已经说了必需援引它才得以行使InternetGetConnectedState函数

 2. IsNetworkAlive

亟待服务System Event Notification的扶助(系统暗许自动运行该服务),且必要安装新型的SDK(如.NET)

浏览:MSDN对IsNetworkAlive的详细描述

由API中翻译:该意义可在Windows XP、二零零三(或Windows NT 4.0与Internet Explorer 5或越来越高版本卡塔尔(قطر‎上利用,在windows95或更加高版本上采纳Internet Explorer 5或更加高版本。所以,平日的系统都以支撑的

下边依旧提交三个进程来判别当前网络的场合,此番是叁个经过

三、URL.DLL中的InetIsOffline函数。

 

在DELPHI中引用wininet这几个单元就足以一向利用 InternetGetConnectedState函数了,上面给出叁个确定当前网络连接状态的函数,在批注中会风流倜傥大器晚成解释它的有的连锁再次回到值的意思。

procedure ShowNetWorkState();
var
falg:integer;
Bos:boolean;
begin
  Bos:=false;
  IsNetworkAlive(falg);
  case falgof
   NETWORK_ALIVE_LAN:
     begin
       Showmessage('通过局域网络网。'卡塔尔国;
       Bos:=true;
     end;
   NETWORK_ALIVE_WAN:
     begin
     Showmessage('通过广域英特网网。'卡塔尔;
       Bos:=true;
     end;
   NETWORK_ALIVE_AOL:
     begin
       Showmessage('联上美利哥的互连网。'卡塔尔(英语:State of Qatar);  //仅对98/95一蹴而就所以平日不要判定NETWOPRADOK_ALIVE_AOL
       Bos:=true;
     end;
    else Showmessage('未有联网。'卡塔尔国;
  end;  //case
if Bos then Showmessage('你今后是联网状态!'卡塔尔国
  elseShowmessage('你今后是离线状态!'卡塔尔;
end;