Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Kiểm tra kết nối Internet trong C#

Kiểm tra xem máy có kết nối internet hoạt động hay không bằng cách gửi request đến endpoint tin cậy.

Cách 1: HttpClient / WebClient ping endpoint tin cậy


using System.Net.Http;

public static async Task IsConnectedAsync()
{
    try
    {
        using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(5) };
        // Google 204 endpoint: trả về 204 No Content, rất nhẹ
        var response = await client.GetAsync("https://www.google.com/generate_204");
        return response.IsSuccessStatusCode;
    }
    catch
    {
        return false;
    }
}

// Synchronous (legacy)
public static bool IsConnected()
{
    try
    {
        using var client = new WebClient { Timeout = 5000 };
        using var stream = client.OpenRead("https://www.google.com/generate_204");
        return true;
    }
    catch
    {
        return false;
    }
}

Cách 2: NetworkInformation (Chỉ check network interface, không đảm bảo internet)


using System.Net.NetworkInformation;

public static bool IsNetworkAvailable()
{
    return NetworkInterface.GetIsNetworkAvailable();
    // Chỉ báo có network adapter up, KHÔNG đảm bảo có internet
}

Cách 3: Ping (ICMP) - Nhanh nhưng có thể bị chặn firewall


using System.Net.NetworkInformation;

public static bool PingCheck(string host = "8.8.8.8", int timeoutMs = 3000)
{
    try
    {
        using var ping = new Ping();
        PingReply reply = ping.Send(host, timeoutMs);
        return reply.Status == IPStatus.Success;
    }
    catch
    {
        return false;
    }
}

Ví dụ hoàn chỉnh: Retry loop


class Program
{
    static async Task Main()
    {
        Console.WriteLine("Checking internet connection...");
        
        while (true)
        {
            bool connected = await IsConnectedAsync();
            Console.WriteLine(connected ? "✓ Connected" : "✗ Disconnected");
            
            if (connected) break;
            await Task.Delay(5000); // Wait 5s before retry
        }
    }
    
    static async Task IsConnectedAsync()
    {
        try
        {
            using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(3) };
            var resp = await client.GetAsync("https://www.google.com/generate_204");
            return resp.IsSuccessStatusCode;
        }
        catch { return false; }
    }
}

Endpoint tin cậy cho health check

URLProviderĐặc điểm
https://www.google.com/generate_204Google204 No Content, rất nhẹ, chuẩn cho Android/Chrome
https://connectivitycheck.gstatic.com/generate_204GoogleTương tự, dùng cho captive portal detection
https://www.msftconnecttest.com/connecttest.txtMicrosoftTrả về "Microsoft Connect Test"
https://cloudflare.com/cdn-cgi/traceCloudflareTrả về thông tin trace, hỗ trợ HTTPS

Best Practices

  • Dùng HttpClient (không dùng WebClient - obsolete).
  • Set Timeout ngắn (3-5s) để không block lâu.
  • Dùng endpoint HTTP (không HTTPS) để tránh SSL handshake overhead + cert issues.
  • Catch tất cả exception (network, DNS, timeout, SSL).
  • Không check liên tục trong loop chặt -> dùng timer/background service.
  • Trong ASP.NET Core: Health Checks (Microsoft.Extensions.Diagnostics.HealthChecks).