判断网络是否连接,获取电脑的网络连接状态

图片 3

判断网络是否连接,获取电脑的网络连接状态

 推断连网的主意介绍

推断网络的是还是不是连接可能一而再三番三回情势,超级重大的有些便是是否即时判别,纵然您领悟无连接,推断出来却说你有,连接上了,却说你还未有连接,上边要介绍的两个措施中InternetGetConnectedState即便多少够即时的API函数,而第3个使用的是IsNetworkAlive以此API函数,那几个从未InternetGetConnectedState的这种问题,可是大概必要安装SDK,也正是.Net框架。

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

一、InternetGetConnectedState

 2. IsNetworkAlive

亟需服务System Event
Notification的接济(系统私下认可自动运转该服务卡塔尔,且须求设置新型的SDK(如.NET卡塔 尔(阿拉伯语:قطر‎

浏览:MSDN对IsNetworkAlive的详细描述

由API中翻译:该意义可在Windows XP、贰零零贰(或Windows NT 4.0与Internet
Explorer 5或更加高版本)上接收,在windows95或更加高版本上运用Internet
Explorer 5或更加高版本。所以,日常的系统都是支撑的

在DELPHI中援引wininet这一个单元就能够一向运用 InternetGetConnectedState函数了,下边给出叁个确定当前网络连接状态的函数,在批注中会大器晚成生机勃勃解释它的有的连锁重临值的意义。

输出值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(局域网卡塔 尔(阿拉伯语:قطر‎

图片 2

 

uses wininet;//这么些已经说了总得援引它才方可接收InternetGetConnectedState函数

返回值(bool)

  • 当再次回到值为true,且无不当Code时,表示网络已三番五次
  • 当重回值为false,且无不当Code时,表示互连网未连接

那么,错误Code(相当卡塔 尔(阿拉伯语:قطر‎怎么获取呢?

functionConnectionKind :boolean;
var flags: dword;
begin
  Result :=InternetGetConnectedState(@flags, 0);
    if Result then
     begin
       if (flags
andINTERNET_CONNECTION_MODEM) =INTERNET_CONNECTION_MODEM then showmessage(‘在线:拨号上网’);
       if (flags and
INTERNET_CONNECTION_LAN)= INTERNET_CONNECTION_LAN then showmessage(‘在线:通过局域网’);
       if (flags
andINTERNET_CONNECTION_PROXY) =INTERNET_CONNECTION_PROXY then showmessage(‘在线:代理’);
       if (flags
andINTERNET_CONNECTION_MODEM_BUSY)=INTERNET_CONNECTION_MODEM_BUSYthen showmessage(‘MODEM被其余非INTELX570NET连接占用’);
     end; //if
end;//function

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

经过甘休 下边说下各各重临值的意趣:
INTERNET_CONNECTION_MODEM: //现在是因而拨号格局上网的
INTERNET_CONNECTION_LAN:  //今后是透过局域英特网网的
INTERNET_CONNECTION_PROXY: //以后是通过代办上网的
INTERNET_CONNECTION_MODEM_BUSY: //以往MODEM被别的非INTEKugaNET连接占用(离线卡塔 尔(阿拉伯语:قطر‎

 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     }

如上便是通过利用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     }

 赢得系统的网络状态与有线网的确定性信号强度(格数卡塔 尔(阿拉伯语:قطر‎

 

[hr]

 

二、IsNetworkAlive

Delphi中从不对这么些函数进行宣示,所以大家要自个儿注解,请把下部的代码参预到近些日子窗体只怕单元的
评释全局变量之处也正是率先个var下边。

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

还应该有要定义多少个常量:

Const NETWORK_ALIVE_LAN
=1;  //通过局域英特网网
ConstNETWORK_ALIVE_WAN =
2;  //通过广域英特网网
ConstNETWORK_ALIVE_AOL =
4;  //仅对98/95卓有成效决断是或不是联上花旗国网络

上面照旧交给二个历程来决断当前网络的状态,本次是三个进度

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(‘联上美利坚联邦合众国的互联网。’);  //仅对98/95卓有效用所以日常不要决断NETWOPRADOK_ALIVE_AOL
       Bos:=true;
     end;
    else Showmessage(‘未有联网。’);
  end;  //case
if Bos then Showmessage(‘你现在是联网状态!’)
  elseShowmessage(‘你将来是离线状态!’);
end;

上边再介绍多个办法能够决断互联网是或不是衔接的。

三、URL.DLL中的InetIsOffline函数。

Delphi中一向不对该函数进行宣示,所以我们要和谐申明,那跟上边的第两种方法的扬言是同个所以然
函数申明为:
functionInetIsOffline(Flag:
Integer): Boolean;stdcall; external ‘URL.DLL’;

下一场就能够调用函数剖断系统是还是不是连接到INTE奥迪Q5NET

if InetIsOffline(0)then ShowMessage(‘未有连接到互联网’)
else ShowMessage(‘已经延续到网络’);

该函数再次回到TRUE表明地点系统尚未连接到INTETiggoNET。
附:
好些个富有IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

admin

网站地图xml地图