看清互连网是不是连接,Delphi判断网络链接

 判断连网的主意介绍

认清互联网的是还是不是连接只怕接二连三形式,相比首要的有个别正是是还是不是即时判断,假设你分明无连接,判断出来却说你有,连接上了,却说你还未连接,下边要介绍的多少个措施中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、3000(或Windows NT 4.0与Internet
Explorer 5或更高版本)上利用,在windows95或更高版本上选择Internet
Explorer 5或更高版本。所以,一般的体系都以帮助的

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

一、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;//那么些已经说了必须引用它才足以选取看清互连网是不是连接,Delphi判断网络链接。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被其余非INTE本田CR-VNET连接占用’);
     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可收获最终2个非托管函数的不当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被别的非INTEPAJERONET连接占用(离线)

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

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

 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被其余非INTEOdysseyNET连接占用(离线)

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

 推荐判断电脑接二连三互联网的方案

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

再有要定义七个常量:

接下来就能够调用函数判断系统是不是连接到INTE揽胜NET

还有要定义四个常量:

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卓有作用判断是不是联上U.S.A.网络

上边依旧交给多个历程来判定当前网络的意况,这一次是三个进程

该函数重返TRUE表明地点系统绝非连接到INTEEscortNET。
附:
多数负有IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

上边依旧交给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(‘联上美国的互连网。’);
//仅对98\95管用所以一般不要判断NETWOSportageK_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(‘联上米利坚的网络。’);  //仅对98/95可行所以一般不要判断NETWO奇骏K_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函数。

 2。Delphi里面包车型客车TcpServer。很抑郁的是也不即时。

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

Delphi中一直不对该函数实行宣示,所以大家要和谐证明,那跟下边包车型地铁第二种办法的宣示是同个所以然
函数证明为:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external
‘URL.DLL’;

示例:

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

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

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

该函数重返TRUE表明地点系统绝非连接到INTEOdysseyNET。
附:
绝大多数存有IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

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

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

该函数重临TRUE表达地方系统没有连接到INTE奥迪Q3NET。
附:
大多数有所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被此外非INTETucsonNET连接占用);
      end; //if
end; //function

进度甘休 上面说下各各重临值的趣味:
INTERNET_CONNECTION_MODEM: //未来是通过拨号方式上网的
INTERNET_CONNECTION_LAN:   //今后是由此局域网上网的
INTERNET_CONNECTION_PROXY: //今后是经过代理上网的
INTERNET_CONNECTION_MODEM_BUSY:
//现在MODEM被其它非INTESportageNET连接占用(离线)

经过测试, 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管用判断是还是不是联上U.S.A.互连网

互联网上有史以来弥新的不变给出的依然其一进度。

看清平日出标题,一般不引进。

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地图