当前位置: 凤凰彩票官方app > 编程知识 > 正文

剖断互连网是不是连接,获取Computer的互联网连接

时间:2019-10-24 04:28来源:编程知识
 判别连网的主意介绍 决断互联网的是还是不是连接可能三番五次格局,超重大的一些便是是还是不是即时判定,要是您驾驭无连接,判别出来却说你有,连接上了,却说你尚未连接,

 判别连网的主意介绍

决断互联网的是还是不是连接可能三番五次格局,超重大的一些便是是还是不是即时判定,要是您驾驭无连接,判别出来却说你有,连接上了,却说你尚未连接,上边要介绍的七个点子中InternetGetConnectedState不畏有一点够即时的API函数,而首个利用的是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);

凤凰彩票官方app 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(局域网)

凤凰彩票官方app 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被其它非INTECRUISERNET连接占用');
     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

凤凰彩票官方app, 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被其余非INTE奥迪Q5NET连接占用(离线)

 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. 计算机配置了虚构机连接--断网后,IsNetworkAlive重返的是有网true !-- 对设想机等互联网是不是连接不能够判定。
  2. 在有些景况下,光导纤维等坏了,上持续网络,可是走TCP公约得以聊微信QQ--IsNetworkAlive重返的是有网true !

无网络时,有相当的大恐怕回到有网:lpdwFlags=1 局域网时,假如当前安顿了虚构机连接之类的,本机无法连接网络时,IsNetworkAlive函数依旧会重临true。如下:

凤凰彩票官方app 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得力判定是还是不是联上U.S.A.互联网

上边依旧交给二个经过来决断当前网络的事态,此番是二个历程

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实惠所以平常不要决断NETWO安德拉K_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本田CR-VNET

if InetIsOffline(0)then ShowMessage('未有连接到网络')
else ShowMessage('已经三番两次到互联网');

该函数重回TRUE表明地点系统并未连接到INTE瑞鹰NET。
附:
绝大相当多颇有IE或OFFICE97的体系都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

编辑:编程知识 本文来源:剖断互连网是不是连接,获取Computer的互联网连接

关键词: