威尼斯人线上娱乐

取得计算机的互连网连接状态,用Delphi即时判断当前的网络的总是格局

1 4月 , 2019  

 判断连网的点子介绍

认清网络的是不是连接恐怕再而三格局,比较重庆大学的少数正是是还是不是即时判断,借使您肯定无连接,判断出来却说你有,连接上了,却说你还未连接,上面要介绍的多个方法中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 四.0与Internet
Explorer 5或更高版本)上行使,在windows9五或更高版本上采用Internet
Explorer 5或更高版本。所以,一般的连串都是接济的

在DELPHI中引用wininet那个单元就足以平素动用 InternetGetConnectedState函数了,上面给出一个断定当前网络连接状态的函数,在诠释中会一一解释它的部分相关重返值的意义。

一、InternetGetConnectedState

*Blog:

输出值lpdwFlags

切切实实品种的事无巨细内容可链接QOCINFO
structure取得计算机的互连网连接状态,用Delphi即时判断当前的网络的总是格局。.aspx)

  • NETWORK_ALIVE_LAN=一 局域网(此处并非指有线网)
  • NETWORK_ALIVE_WAN=二远程访问-拨号访问和vpn访问(此处并非唯有线网,按DPI所示,指的是RAS
    connections)
  • NETWORK_ALIVE_AOL=肆无效的值。。。因为唯有Win九x系统才有此第多个选用。参照链接

有线互连网的论断:lpdwFlags对是不是无线网络,并没有一直的判断。

eg:比如自个儿的总括机环境(有线网络大概wifi网络),获取的flag=一(局域网)

威尼斯人线上娱乐 2

 

uses wininet;//那几个早已说了亟须引用它才足以动用InternetGetConnectedState函数

在DELPHI中 引用wininet这一个单元就足以一贯动用
InternetGetConnectedState函数了,上面给出叁个断定当前互连网连接状态的函数,在诠释中会1壹解释它的一些辅车相依再次回到值的意义。

*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被此外非INTESportageNET连接占用’);
     end; //if
end;//function

uses wininet; //这些早已说了
必须引用它才方可使用InternetGetConnectedState函数

/

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

参照链接

此间推荐使用马尔斯hal中的GetLastWin3贰Error,见如下源代码:

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

GetLastWin3贰Error可得到最终贰个非托管函数的荒谬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被其余非INTE奥迪Q3NET连接占用’);
end; //if
end; //function

Delphi判断互连网链接,首要一个地点:判断是还是不是有网络连接;判断互连网连接情势;禁止使用/启用
本地互连网连接 。

 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被其它非INTE奥迪Q5NET连接占用(离线)

认清互连网连接一定要霎时的,不要拔了网线还提醒有互连网连接。

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

如上,获取网络状态是否连接,建议通过IsNetworkAlive函数获取。那么IsNetworkAlive是不是准确吗?

答案是不是!

案例:

  1. 电脑配置了虚拟机连接–断网后,IsNetworkAlive再次回到的是有网true !–
    对虚拟机等互连网是不是连接不能够断定。
  2. 在少数情形下,光导纤维等坏了,上连发网络,不过走TCP协议可以聊微信QQ–IsNetworkAlive重返的是有网true
    !

无网络时,有不小概率回到有网:lpdwFlags=一局域网时,借使当前布局了虚拟机连接之类的,本机不能连接互连网时,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’;

再有要定义八个常量:

然后就能够调用函数判断系统是或不是连接到INTE奥德赛NET

再有要定义多少个常量:

Const NETWORK_ALIVE_LAN = 一; //通过局域网上网
Const NETWORK_ALIVE_WAN = 二; //通过广域网上网
Const NETWORK_ALIVE_AOL = 4; //仅对98\九五使得判断是还是不是联上美利哥互连网

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

Const NETWORK_ALIVE_LAN
=一;  //通过局域网上网
ConstNETWORK_ALIVE_WAN =
二;  //通过广域网上网
ConstNETWORK_ALIVE_AOL =
4;  //仅对98/玖5有效判断是或不是联上美利坚合众国互连网

上面依然提交二个经过来判断当前互联网的图景,此次是三个历程

该函数再次回到TRUE表明地点系统绝非连接到INTELacrosseNET。
附:
超过45%有所IE或OFFICE九七的体系都有此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(‘联上美利哥的网络。’);
//仅对九八\95管用所以1般不要判断NETWO普拉多K_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.的互连网。’);  //仅对98/95得力所以1般不要判断NETWOLacrosseK_ALIVE_AOL
       Bos:=true;
     end;
    else Showmessage(‘没有联网。’);
  end;  //case
if Bos then Showmessage(‘你今后是联网状态!’)
  elseShowmessage(‘你现在是离线状态!’);
end;

本条作者就不多做解释了,上边的那四个措施是能够用来判断互连网连接的措施,也足以用来判定网络是不是衔接。

 

下边再介绍三个艺术能够看清互联网是或不是衔接的。


威尼斯人线上娱乐 5

三、URL.DLL中的InetIsOffline函数。

下边再介绍一个主意能够判明互联网是或不是衔接的。

 

Delphi中绝非对该函数实行宣示,所以大家要协调评释,这跟上边的第二种艺术的注解是同个所以然
函数评释为:
functionInetIsOffline(Flag:
Integer): Boolean;stdcall; external ‘URL.DLL’;

三、URL.DLL中的InetIsOffline函数。

 二。Delphi里面包车型地铁TcpServer。很窝火的是也不即时。

下一场就能够调用函数判断系统是不是连接到INTE昂CoraNET

Delphi中从不对该函数实行宣示,所以我们要协调注解,那跟上边的第三种艺术的宣示是同个所以然
函数注解为:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external
‘URL.DLL’;

示例:

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

然后就足以调用函数判断系统是或不是连接到INTE纳瓦拉NET

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

该函数重回TRUE表达地点系统没有连接到INTE途乐NET。
附:
大多数持有IE或OFFICE玖七的体系都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

if InetIsOffline(0) then ShowMessage(‘没有连接到互联网’)
else ShowMessage(‘已经三番五次到网络’);

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

该函数再次回到TRUE表达地点系统绝非连接到INTEHighlanderNET。
附:
当先八分之四具备IE或OFFICE玖7的连串都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

威尼斯人线上娱乐 6

 

 

3。InternetGetConnectedState

在DELPHI中 引用wininet那几个单元就能够一向动用
InternetGetConnectedState函数了,上面给出叁个论断当前互联网连接状态的函数,在诠释中会一1解释它的有个别有关再次来到值的含义。

网上都以概念为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被其余非INTE途乐NET连接占用);
      end; //if
end; //function

进度甘休 上边说下各各重返值的情致:
INTERNET_CONNECTION_MODEM: //现在是透过拨号格局上网的
INTERNET_CONNECTION_LAN:   //今后是经过局域网上网的
INTERNET_CONNECTION_PROXY: //未来是由此代办上网的
INTERNET_CONNECTION_MODEM_BUSY:
//今后MODEM被其余非INTE兰德酷路泽NET连接占用(离线)

通过测试, InternetGetConnectedState函数
不像某个人说的不即时,倒是很即时,1般都对。

 

威尼斯人线上娱乐 7

 

4。IsNetworkAlive

Delphi中尚无对这几个函数举行宣示,所以我们要协调证明,能够在var下,也可在implementation下。

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

还有要定义三个常量:

Const NETWORK_ALIVE_LAN = 一; //通过局域网上网
Const NETWORK_ALIVE_WAN = 二; //通过广域网上网
Const NETWORK_ALIVE_AOL = 四; //仅对98玖五实惠判断是或不是联上美利坚合营国互连网

网络上有史以来弥新的不变给出的照旧以此历程。

认清日常出标题,1般不推荐。

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可行所以1般不要判断NETWOPRADOK_ALIVE_AOL
        Bos:=true;
      end;
    else Showmessage(没有联网。);
end;   //case
if<

*Author:Insun
*Blog: *From:www.4safer.com /
Delphi判断网络链接,首要三个方面:判断是还是不是有互联网连接;…


相关文章

发表评论

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

网站地图xml地图