简介
在某些情况下,您需要在 Windows 应用程序中使用 C# 代码检查 Internet 是否可用。可能是使用互联网以 Windows 形式下载或上传文件,或者从远程位置的数据库中获取一些数据,在这些情况下,互联网检查是强制性的。
有一些方法可以使用 C# 从后面的代码中检查 Internet 可用性。此处解释了所有这些方式,包括它们的局限性。
- InternetGetConnectedState(wininet)
'wininet' API 可用于检查本地系统是否有活动的互联网连接。用于此的命名空间是“System.Runtime.InteropServices”并使用 DllImport 导入 dll“wininet.dll”。在此之后创建一个带有 extern static 的布尔变量,其函数名称为 InternetGetConnectedState,其中包含两个参数 description 和 reservedValue,如示例所示。
注意:extern 修饰符用于声明在外部实现的方法。当您使用互操作服务调用非托管代码时,extern 修饰符的一个常见用途是与 DllImport 属性一起使用。在这种情况下,该方法也必须声明为静态。
接下来创建一个名为“IsInternetAvailable”作为布尔值的方法。这
上面的函数将在这个返回互联网的方法中使用
本地系统状态
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int description, int reservedValue);
public static bool IsInternetAvailable()
{
try
{
int description;
return InternetGetConnectedState(out description, 0);
}
catch (Exception ex)
{
return false;
}
}
- GetIsNetworkAvailable
以下示例使用 GetIsNetworkAvailable 方法来确定网络连接是否可用。
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
System.Windows.MessageBox.Show("This computer is not connected to the internet");
}
备注(根据 MSDN):如果任何网络接口被标记为“up”并且不是环回或隧道接口,则认为网络连接可用。
在很多情况下,设备或计算机未连接到有用的网络,但仍被认为可用,GetIsNetworkAvailable 将返回 true。例如,如果运行应用程序的设备连接到需要代理的无线网络,但未设置代理,则 GetIsNetworkAvailable 将返回 true。 GetIsNetworkAvailable 何时返回 true 的另一个示例是,如果应用程序在连接到集线器或路由器的计算机上运行,而该集线器或路由器已失去上游连接。
- Ping 网络上的主机名
Ping 和 PingReply 类允许应用程序通过从主机获取回复来确定远程计算机是否可通过网络访问。这些类在 System.Net.NetworkInformation 命名空间中可用。以下示例显示了如何 ping 主机。
protected bool CheckConnectivity(string ipAddress)
{
bool connectionExists = false;
try
{
System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
options.DontFragment = true;
if (!string.IsNullOrEmpty(ipAddress))
{
System.Net.NetworkInformation.PingReply reply = pingSender.Send(ipAddress);
connectionExists = reply.Status ==
System.Net.NetworkInformation.IPStatus.Success ? true : false;
}
}
catch (PingException ex)
{
Logger.LogException(ex.Message, ex);
}
return connectionExists;
}
备注(根据 MSDN):应用程序使用 Ping 类来检测远程计算机是否可访问。网络拓扑可以确定 Ping 是否可以成功联系到远程主机。代理、网络地址转换 (NAT) 设备或防火墙的存在和配置会阻止 Ping 成功。 Ping 成功仅表明网络上可以访问远程主机;无法保证远程主机上存在更高级别的服务(例如 Web 服务器)。
欢迎评论/建议。编码快乐......!