认清网络是不是连接,获取总括机的互连网连接状态

 判断连网的方式介绍

判定互连网的是还是不是连接可能两次三番格局,相比重庆大学的有个别正是是否即时判断,假如你肯定无连接,判断出来却说你有,连接上了,却说你还未连接,上面要介绍的四个艺术中InternetGetConnectedState不畏有点够即时的API函数,而第二个利用的是IsNetworkAlive这些API函数,那些没有InternetGetConnectedState的那种难题,可是只怕须求设置SDK,相当于.Net框架。

/*Title:Delphi判断互连网链接

 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

判定互连网的是否连接大概一而再方式,对比主要的某个就是是否即时判断,要是你肯定无连接,判断出来却说你有,连接上了,却说你还未连接,上边要介绍的多个法子中
InternetGetConnectedState就是不怎么够即时的API函数,而第二个利用的是IsNetworkAlive那么些API函数,这么些没有InternetGetConnectedState的那种难题,可是或者须求设置SDK,也正是.Net框架。

*Author:Insun

 2. IsNetworkAlive

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

浏览:MSDN对IsNetworkAlive的详细描述

由API中翻译:该功用可在Windows XP、三千(或Windows NT 4.0与Internet
Explorer 5或更高版本)上选取,在windows95或更高版本上使用Internet
Explorer 5或更高版本。所以,一般的连串都以永葆的

在DELPHI中引用wininet这么些单元就足以一贯运用 认清网络是不是连接,获取总括机的互连网连接状态。InternetGetConnectedState函数了,下边给出二个断定当前网络连接状态的函数,在诠释中会一一解释它的有的连锁重返值的意义。

一、InternetGetConnectedState

*Blog:

输出值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函数

在DELPHI中 引用wininet那几个单元就能够直接采取InternetGetConnectedState函数了,上面给出二个断定当前网络连接状态的函数,在诠释中会一一解释它的有的连锁再次来到值的含义。

*From:www.4safer.com

返回值(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被别的非INTEPRADONET连接占用’);
     end; //if
end;//function

uses wininet; //那几个已经说了
必须引用它才方可选用InternetGetConnectedState函数

/

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可收获最终3个非托管函数的荒唐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被别的非INTE锐界NET连接占用(离线)

function ConnectionKind :boolean;
var flags: dword;
begin
Result := InternetGetConnectedState(@flags, 0);
if Result then
begin
if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM
then showmessage(‘在线:拨号上网’);
if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN
then showmessage(‘在线:通过局域网’);
if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY
then showmessage(‘在线:代理’);
if (flags and
INTERNET_CONNECTION_MODEM_BUSY)=INTERNET_CONNECTION_MODEM_BUSY
then showmessage(‘MODEM被别的非INTELacrosseNET连接占用’);
end; //if
end; //function

Delphi判断网络链接,重要1个地方:判断是或不是有互连网连接;判断网络连接形式;禁止使用/启用
本地网络连接 。

 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函数实现的论断网络状态的主意

进度甘休 上面说下各各重返值的意思:
INTERNET_CONNECTION_MODEM: //以往是由此拨号形式上网的
INTERNET_CONNECTION_LAN: //今后是透过局域网上网的
INTERNET_CONNECTION_PROXY: //以后是通过代办上网的
INTERNET_CONNECTION_MODEM_BUSY:
//以后MODEM被其余非INTEMuranoNET连接占用(离线)

判定网络连接一定要立马的,不要拔了网线还提示有互联网连接。

 推荐判断电脑一连网络的方案

如上,获取网络状态是或不是连接,建议通过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     }

 获得系统的互联网状态与有线网的信号强度(格数)

 

如上就是通过行使InternetGetConnectedState函数实现的论断网络状态的法子

亚洲必赢官网 4

[hr]


 

 

二、IsNetworkAlive

1。URL.DLL中的InetIsOffline函数。

二、IsNetworkAlive

Delphi中没有对那么些函数进行宣示,所以大家要团结申明,请把下部的代码插手到当下窗体恐怕单元的
注解全局变量的地方 也正是首先个var下边。

Delphi中没有对该函数进行宣示,所以我们要协调证明,写在implementation下边OK。

Delphi中一贯不对这几个函数举办宣示,所以大家要团结注脚,请把下边包车型客车代码插手到当下窗体大概单元的
表明全局变量的地点也便是首先个var下边。

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

函数申明为:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external
URL.DLL;

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

还有要定义八个常量:

下一场就足以调用函数判断系统是还是不是连接到INTERAV4NET

再有要定义四个常量:

Const NETWORK_ALIVE_LAN = 1; //通过局域网上网
Const NETWORK_ALIVE_WAN = 2; //通过广域网上网
Const NETWORK_ALIVE_AOL = 4; //仅对98\95得力判断是还是不是联上米利坚网络

if InetIsOffline(0) then ShowMessage(没有连接到互联网)
else ShowMessage(已经一而再到互联网);

Const NETWORK_ALIVE_LAN
=1;  //通过局域网上网
ConstNETWORK_ALIVE_WAN =
2;  //通过广域网上网
ConstNETWORK_ALIVE_AOL =
4;  //仅对98/95使得判断是或不是联上美利坚合资国互联网

下边照旧提交贰个经过来判定当前网络的气象,这一次是贰个历程

该函数再次来到TRUE表达地点系统并未连接到INTE奥迪Q5NET。
附:
多数颇具IE或OFFICE97的类别都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

下边依旧提交一个进度来判定当前互联网的情状,这一次是多个经过

procedure ShowNetWorkState();
var
falg:integer;
Bos:boolean;
begin
Bos:=false;
IsNetworkAlive(falg);
case falg of
NETWORK_ALIVE_LAN:
begin
Showmessage(‘通过局域网上网。’);
Bos:=true;
end;
NETWORK_ALIVE_WAN:
begin
Showmessage(‘通过广域网上网。’);
Bos:=true;
end;
NETWORK_ALIVE_AOL:
begin
Showmessage(‘联上United States的网络。’);
//仅对98\95实惠所以一般不要判断NETWO奥迪Q7K_ALIVE_AOL
Bos:=true;
亚洲必赢官网,end;
else Showmessage(‘没有联网。’);
end; //case
if Bos then Showmessage(‘你未来是联网状态!’)
else Showmessage(‘你未来是离线状态!’);
end;

测试这一个不即时,老是呈现Connected,已经一连到互联网。

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(‘联上U.S.A.的网络。’);  //仅对98/95使得所以一般不要判断NETWO宝马7系K_ALIVE_AOL
       Bos:=true;
     end;
    else Showmessage(‘没有联网。’);
  end;  //case
if Bos then Showmessage(‘你以后是联网状态!’)
  elseShowmessage(‘你未来是离线状态!’);
end;

本条笔者就不多做表达了,下边包车型地铁那三个方法是能够用来判定网络连接的法门,也得以用来判定互连网是还是不是衔接。

 

下边再介绍贰个情势能够判定互连网是或不是衔接的。


亚洲必赢官网 5

三、URL.DLL中的InetIsOffline函数。

上面再介绍3个主意能够断定互连网是还是不是衔接的。

 

Delphi中绝非对该函数进行宣示,所以我们要协调注脚,那跟上面包车型客车第叁种艺术的注解是同个道理
函数注脚为:
functionInetIsOffline(Flag:
Integer): Boolean;stdcall; external ‘URL.DLL’;

三、URL.DLL中的InetIsOffline函数。

 2。Delphi里面包车型地铁TcpServer。很心烦的是也不即时。

下一场就足以调用函数判断系统是还是不是连接到INTE奥德赛NET

Delphi中平素不对该函数进行宣示,所以大家要团结证明,那跟上面的第三种形式的宣示是同个所以然
函数证明为:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external
‘URL.DLL’;

示例:

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

下一场就能够调用函数判断系统是还是不是连接到INTE中华VNET

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
   TcpServer1.Active :=True ;
   ShowMessage(互连网已接二连三)

该函数再次回到TRUE表明地点系统并未连接到INTE凯雷德NET。
附:
当先50%独具IE或OFFICE97的种类都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

if InetIsOffline(0) then ShowMessage(‘没有连接到网络’)
else ShowMessage(‘已经接二连三到网络’);

  except
    ShowMessage(互连网没连接);
  end;
end;

该函数再次回到TRUE表明地点系统绝非连接到INTEXC60NET。
附:
大部负有IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

亚洲必赢官网 6

 

 

3。InternetGetConnectedState

在DELPHI中 引用wininet那么些单元就足以平素利用
InternetGetConnectedState函数了,下边给出一个断定当前互连网连接状态的函数,在诠释中会一一解释它的一对连锁再次来到值的意义。

网上都以概念为ConnectionKind那个函数,好默契。

 

uses wininet; //这一个已经说了
必须引用它才得以行使InternetGetConnectedState函数

function ConnectionKind :boolean;
var flags: dword;
begin
Result := InternetGetConnectedState(@flags, 0);
    if Result then
      begin
        if (flags and INTERNET_CONNECTION_MODEM) =
INTERNET_CONNECTION_MODEM then showmessage(在线:拨号上网);
        if (flags and INTERNET_CONNECTION_LAN) =
INTERNET_CONNECTION_LAN then showmessage(在线:通过局域网);
        if (flags and INTERNET_CONNECTION_PROXY) =
INTERNET_CONNECTION_PROXY then showmessage(在线:代理);
        if (flags and
INTERNET_CONNECTION_MODEM_BUSY)=INTERNET_CONNECTION_MODEM_BUSY
then showmessage(MODEM被别的非INTEPRADONET连接占用);
      end; //if
end; //function

进程甘休 上边说下各各再次回到值的意味:
INTERNET_CONNECTION_MODEM: //以后是通过拨号情势上网的
INTERNET_CONNECTION_LAN:   //今后是透过局域网上网的
INTERNET_CONNECTION_PROXY: //未来是通过代理上网的
INTERNET_CONNECTION_MODEM_BUSY:
//未来MODEM被别的非INTE奥迪Q5NET连接占用(离线)

经过测试, InternetGetConnectedState函数
不像一些人说的不即时,倒是很即时,一般都对。

 

亚洲必赢官网 7

 

4。IsNetworkAlive

Delphi中从未对那些函数进行宣示,所以大家要协调评释,能够在var下,也可在implementation下。

Function IsNetworkAlive(var
lpdwFlagsLib:Integer):Integer;stdcall;externalSENSAPI.DLL;

再有要定义两个常量:

Const NETWORK_ALIVE_LAN = 1; //通过局域网上网
Const NETWORK_ALIVE_WAN = 2; //通过广域网上网
Const NETWORK_ALIVE_AOL = 4; //仅对9895实惠判断是还是不是联上美国互连网

互连网上一直弥新的不变给出的依然以此进度。

看清平时出标题,一般不推荐。

procedure ShowNetWorkState();
var
falg:integer;
Bos:boolean;
begin
Bos:=false;
IsNetworkAlive(falg);
case falg of
    NETWORK_ALIVE_LAN:
      begin
        Showmessage(通过局域网上网。);
        Bos:=true;
      end;
    NETWORK_ALIVE_WAN:
      begin
      Showmessage(通过广域网上网。);
        Bos:=true;
      end;
    NETWORK_ALIVE_AOL:
      begin
        Showmessage(联上美利坚合众国的互连网。);
//仅对9895立见成效所以一般不要判断NETWO帕杰罗K_ALIVE_AOL
        Bos:=true;
      end;
    else Showmessage(没有联网。);
end;   //case
if<

*Author:Insun
*Blog: *From:www.4safer.com /
Delphi判断网络链接,主要二个地点:判断是还是不是有网络连接;…

网站地图xml地图