澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 获得计算机的互联网连接状态,判断网络是或不

原标题:获得计算机的互联网连接状态,判断网络是或不

浏览次数:154 时间:2019-09-13

 2. IsNetworkAlive

亟待劳务System Event Notification的支撑(系统暗许自动运行该服务),且供给安装新型的SDK(如.NET)

浏览:MSDN对IsNetwork阿里ve的详细描述

由API中翻译:该功用可在Windows XP、3000(或Windows NT 4.0与Internet Explorer 5或更加高版本)上利用,在windows95或越来越高版本上选用Internet Explorer 5或越来越高版本。所以,一般的体系都是永葆的

Const NETWORK_ALIVE_LAN =1;  //通过局域网络网
ConstNETWORK_ALIVE_WAN = 2;  //通过广域网络网
ConstNETWORK_ALIVE_AOL = 4;  //仅对98/95一蹴而就判别是或不是联上美利坚合众国互连网

输出值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(局域网)

图片 1

 

该函数重临TRUE说明地点系统并未有连接到INTETiggoNET。
附:
绝大多数颇具IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags,
);

 决断连网的艺术介绍

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

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

图片 2

先是,增加非托管函数并调用,能够拿走网络是或不是联网

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

再有要定义八个常量:

返回值(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哈弗NET连接占用');
     end; //if
end;//function

 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     }

Delphi中未有对该函数举行宣示,所以我们要团结注脚,那跟下面的第二种方式的表明是同个道理
函数注明为:
functionInetIsOffline(Flag: Integer): Boolean;stdcall; external 'URL.DLL';

 推荐剖断计算机三翻五次互联网的方案

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

答案是还是不是!

案例:

  1. 计算机配置了虚构机连接--断网后,IsNetworkAlive再次回到的是有网true !-- 对虚构机等互连网是还是不是连接无法看清。
  2. 在好几景况下,光导纤维等坏了,上不停互联网,不过走TCP公约能够聊微信QQ--IsNetworkAlive重临的是有网true !

无网络时,有希望回到有网:lpdwFlags=1 局域网时,假使当前布署了设想机连接之类的,本机无法连接互联网时,IsNetworkAlive函数依然会回到true。如下:

图片 3

  所以,要是是局域网且IsNetwork阿里ve再次来到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

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

 int errCode = Marshal.GetLastWin32Error();

--得到 error code的详细描述新闻,可参谋

值得注意的是,非托管函数表明时,要增多SetLastError=true;如:

1 [DllImport("sensapi.dll", SetLastError = true)]
2 private static extern bool IsNetworkAlive(out int connectionDescription);

uses wininet;//这么些早就说了亟须引用它才得以行使InternetGetConnectedState函数

剖断网络的是还是不是连接或然接二连三格局,很主要的有个别就是是否即时决断,假设您明显无连接,决断出来却说你有,连接上了,却说你还未连接,下边要介绍的八个情势中InternetGetConnectedState纵使有一点点够即时的API函数,而第三个使用的是IsNetworkAlive这一个API函数,那些没有InternetGetConnectedState的这种难题,但是或者必要设置SDK,相当于.Net框架。

三、URL.DLL中的InetIsOffline函数。

[hr]

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

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:获得计算机的互联网连接状态,判断网络是或不

关键词:

上一篇:什么样是CGI、法斯特CGI、PHP-CGI、PHP-FPM、Spawn-FC

下一篇:MVC中使用signalR入门教程