using System;
using System.Net.NetworkInformation;
using System.Threading.Tasks;
public class NetworkChecker
{
// 國內(nèi)廣泛可訪問的公共DNS服務(wù)器
private static readonly string[] dnsServers = new string[]
{
"223.5.5.5", // 阿里云DNS - 覆蓋多運(yùn)營商
"223.6.6.6", // 阿里云DNS備用
"119.29.29.29", // 騰訊DNS - 覆蓋多運(yùn)營商
"180.76.76.76", // 百度DNS - 覆蓋多運(yùn)營商
"1.2.4.8", // 中國互聯(lián)網(wǎng)信息中心DNS
"8.8.8.8" // Google DNS (國內(nèi)部分地區(qū)可用)
};
/// <summary>
/// 檢查是否可以連通外網(wǎng)
/// </summary>
/// <param name="timeoutMs">超時(shí)時(shí)間(毫秒),默認(rèn)2秒</param>
/// <returns>true表示可以連通外網(wǎng),false表示不能</returns>
public static async Task<bool> CanConnectToInternet(int timeoutMs = 2000)
{
try
{
var pingTasks = new Task<PingReply>[dnsServers.Length];
// 并行ping所有DNS服務(wù)器
for (int i = 0; i < dnsServers.Length; i++)
{
pingTasks[i] = PingAsync(dnsServers[i], timeoutMs);
}
// 等待任意一個(gè)ping任務(wù)成功完成
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);
}
}
}