判断连网的法门介绍

判定网络的是或不是连接恐怕一而再方式,相比较重庆大学的一些正是是否即时判断,假设您肯定无连接,判断出来却说你有,连接上了,却说你还未连接,上边要介绍的五个办法中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方法对网络状态的获得Delphi判断互连网链接,用Delphi即时判断当前的网络的连日格局。.aspx)

如上InternetGetConnectedState方法介绍中

  • dwReversed必须安装为0
  • 经过输出值lpdwFlags能够获得当前互连网连接的消息,通过拼装比较能够获得当前连接的互连网项目,如拨号上网/局域网等

    bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);

金沙注册送58 1

率先,添加非托管函数并调用,可以收获网络是还是不是联网

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

一、InternetGetConnectedState

判断互连网的是还是不是连接大概延续格局,相比关键的一点正是是否即时判断,要是你精晓无连接,判断出来却说你有,连接上了,却说你还未连接,下边要介绍的八个点子中
InternetGetConnectedState便是稍稍够即时的API函数,而第3个利用的是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或更高版本)上利用,在windows玖5或更高版本上选用Internet
Explorer 5或更高版本。所以,一般的连串都以支撑的

在DELPHI中引用wininet这一个单元就足以一贯动用 InternetGetConnectedState函数了,上面给出二个判定当前网络连接状态的函数,在诠释中会壹一解释它的片段相关再次来到值的意思。

一、InternetGetConnectedState

*Blog:

输出值lpdwFlags

切实品种的事无巨细内容可链接QOCINFO
structure.aspx)

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

有线网络的论断:lpdwFlags对是或不是有线互连网,并没有平昔的判断。

eg:比如本人的总括机环境(有线网络可能wifi网络),获取的flag=一(局域网)

金沙注册送58 2

 

uses wininet;//那些曾经说了总得引用它才得以行使InternetGetConnectedState函数

在DELPHI中 引用wininet那一个单元就能够间接运用
InternetGetConnectedState函数了,上边给出2个断定当前网络连接状态的函数,在诠释中会壹壹解释它的局地休戚相关重回值的含义。

*From:www.4safer.com

返回值(bool)

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

那么,错误Code(很是)怎么获取呢?

functionConnectionKind :boolean;
var flags: dword;
begin
  Result :=InternetGetConnectedState(@flags, 0);
    if Result then
     begin
金沙注册送58,       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

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

/

三. 取得上二遍分外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();

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被别的非INTECR-VNET连接占用’);
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君越NET连接占用(离线)

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

 推荐判断电脑延续网络的方案

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

答案是不是!

案例:

  1. 电脑配置了虚拟机连接–断网后,IsNetworkAlive重回的是有网true !–
    对虚拟机等互联网是还是不是连接无法判定。
  2. 在1些景况下,光导纤维等坏了,上持续互联网,可是走TCP协议得以聊微信QQ–IsNetworkAlive重临的是有网true
    !

无互联网时,有十分的大可能率回到有网:lpdwFlags=壹局域网时,即使当前陈设了虚拟机连接之类的,本机不能连接互联网时,IsNetworkAlive函数依旧会回来true。如下:

金沙注册送58 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函数完成的判断网络状态的法子

金沙注册送58 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 = 1; //通过局域网上网
Const NETWORK_ALIVE_WAN = 二; //通过广域网上网
Const NETWORK_ALIVE_AOL = 4; //仅对98\九5得力判断是还是不是联上美利坚联邦合众国互连网

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

Const NETWORK_ALIVE_LAN
=一;  //通过局域网上网
ConstNETWORK_ALIVE_WAN =
二;  //通过广域网上网
ConstNETWORK_ALIVE_AOL =
肆;  //仅对98/玖5得力判断是不是联上美利坚同盟友互联网

上边照旧提交贰个进程来判断当前网络的情况,此次是四个进程

该函数重回TRUE表明地方系统没有连接到INTECR-VNET。
附:
绝超越5六%具有IE或OFFICE玖柒的体系都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

上面照旧提交3个经过来判断当前互连网的图景,这一次是叁个历程

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实用所以一般不要判断NETWORubiconK_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/九五得力所以1般不要判断NETWOBMWX三K_ALIVE_AOL
       Bos:=true;
     end;
    else Showmessage(‘没有联网。’);
  end;  //case
if Bos then Showmessage(‘你以往是联网状态!’)
  elseShowmessage(‘你未来是离线状态!’);
end;

本条自家就不多做解释了,下边包车型大巴那七个措施是足以用来判定互联网连接的点子,也得以用来判断互联网是还是不是衔接。

 

下边再介绍贰个办法能够看清网络是或不是衔接的。


金沙注册送58 5

三、URL.DLL中的InetIsOffline函数。

上面再介绍二个艺术能够判明互联网是还是不是衔接的。

 

Delphi中并未对该函数实行宣示,所以大家要协调表明,那跟上边的第一种艺术的扬言是同个所以然
函数注脚为:
functionInetIsOffline(Flag:
Integer): Boolean;stdcall; external ‘URL.DLL’;

三、URL.DLL中的InetIsOffline函数。

 二。Delphi里面包车型客车TcpServer。很困扰的是也不即时。

然后就足以调用函数判断系统是或不是连接到INTE福特ExplorerNET

Delphi中从未对该函数进行宣示,所以我们要团结表明,那跟下边包车型地铁第二种格局的申明是同个所以然
函数注脚为:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external
‘URL.DLL’;

示例:

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

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
   TcpServer1.Active :=True ;
   ShowMessage(网络已三番五次)

该函数重回TRUE表达地点系统尚未连接到INTE奥迪Q7NET。
附:
当先二分之壹装有IE或OFFICE九柒的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

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

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

该函数再次来到TRUE表达地点系统并未连接到INTE奥迪Q7NET。
附:
多数怀有IE或OFFICE玖7的体系都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

金沙注册送58 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昂CoraNET连接占用);
      end; //if
end; //function

进度结束 上面说下各各重回值的意思:
INTERNET_CONNECTION_MODEM: //未来是因而拨号方式上网的
INTERNET_CONNECTION_LAN:   //今后是经过局域网上网的
INTERNET_CONNECTION_PROXY: //今后是因此代理上网的
INTERNET_CONNECTION_MODEM_BUSY:
//未来MODEM被别的非INTE帕杰罗NET连接占用(离线)

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

 

金沙注册送58 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 = 4; //仅对98玖5管用判断是还是不是联上U.S.网络

互连网上一向弥新的不变给出的依旧那几个进度。

认清平日出标题,一般不推荐。

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(联上美利坚合作国的互连网。);
//仅对98玖五实用所以1般不要判断NETWO奥迪Q5K_ALIVE_AOL
        Bos:=true;
      end;
    else Showmessage(没有联网。);
end;   //case
if<

*Author:Insun
*Blog: *From:www.四safer.com /
Delphi判断互连网链接,重要二个地点:判断是或不是有互联网连接;…

相关文章

网站地图xml地图