using System;
using System.Net.NetworkInformation;
using System.Threading.Tasks;
public class NetworkChecker
{
// 国内广泛可访问的公共DNS服务器
private static readonly string[] dnsServers = new string[]
{
"223.5.5.5", // 阿里云DNS - 覆盖多运营商
"223.6.6.6", // 阿里云DNS备用
"119.29.29.29", // 腾讯DNS - 覆盖多运营商
"180.76.76.76", // 百度DNS - 覆盖多运营商
"1.2.4.8", // 中国互联网信息中心DNS
"8.8.8.8" // Google DNS (国内部分地区可用)
};
/// <summary>
/// 检查是否可以连通外网
/// </summary>
/// <param name="timeoutMs">超时时间(毫秒),默认2秒</param>
/// <returns>true表示可以连通外网,false表示不能</returns>
public static async Task<bool> CanConnectToInternet(int timeoutMs = 2000)
{
try
{
var pingTasks = new Task<PingReply>[dnsServers.Length];
// 并行ping所有DNS服务器
for (int i = 0; i < dnsServers.Length; i++)
{
pingTasks[i] = PingAsync(dnsServers[i], timeoutMs);
}
// 等待任意一个ping任务成功完成
var completedTask = await Task.WhenAny(pingTasks);
var result = await completedTask;
return result.Status == IPStatus.Success;
}
catch
{
return false;
}
}
private static async Task<PingReply> PingAsync(string address, int timeout)
{
using (var ping = new Ping())
{
return await ping.SendPingAsync(address, timeout);
}
}
}