萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 網路基礎知識

Silverlight / C# 呼叫 WinINet API 快速檢測網路連線狀態(InternetGetConnectedState)

適用場景

  • Silverlight / WPF / WinForms / Console 應用,需輕量級檢測「是否聯網」,不想引入完整 HTTP 請求開銷。
  • 離線模式切換、同步觸發條件判斷。

P/Invoke 簽名

using System;
using System.Runtime.InteropServices;

public static class NetworkDetector
{
    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool InternetGetConnectedState(out int lpdwFlags, int dwReserved);

    public static bool IsConnected()
    {
        int flags = 0;
        return InternetGetConnectedState(out flags, 0);
    }

    // 進階:解析連線類型旗標
    public static ConnectionType GetConnectionType()
    {
        int flags = 0;
        if (!InternetGetConnectedState(out flags, 0)) return ConnectionType.Offline;
        // flags 位元定義參考 MSDN INTERNET_CONNECTION_*
        return (ConnectionType)flags;
    }
}

[Flags]
public enum ConnectionType
{
    Offline = 0,
    Modem = 0x01,           // INTERNET_CONNECTION_MODEM
    LAN = 0x02,             // INTERNET_CONNECTION_LAN
    Proxy = 0x04,           // INTERNET_CONNECTION_PROXY
    ModemBusy = 0x08,       // INTERNET_CONNECTION_MODEM_BUSY
    // ... 其餘旗標略
}

呼叫示例

if (NetworkDetector.IsConnected())
{
    Console.WriteLine("Online - 可發起網路請求");
}
else
{
    Console.WriteLine("Offline - 切換離線模式/提示用戶");
}

注意事項

  • 僅反映 Windows 網路介面層面的「連線狀態」,不保證能訪問特定網站/伺服器(防火牆、代理、DNS 故障、認證頁攔截均可能導致誤判)。
  • 生產環境建議雙重檢測:InternetGetConnectedState 快速篩選 + 實際 HTTP HEAD/GET 請求目標端點驗證。
  • Silverlight 5 已停止支援(2021/10 結束生命週期),新專案請遷移至 Blazor / MAUI / ASP.NET Core + WebAssembly。

替代方案對比

方案優點缺點
InternetGetConnectedState零依賴、極快、無網路流量無法檢測應用層連通性、代理/認證頁誤判
HttpClient/GetAsync HEAD真實驗證目標可達性有延遲、消耗流量、需處理例外
NetworkInformation.GetInternetConnectionProfile (UWP/WinRT)現代 API、支援網路成本/漫遊/資料限制感知僅限 Win10+ / UWP / WinUI 3
Ping (ICMP)簡單、跨平台ICMP 常被封鎖、不代表 TCP/HTTP 通
copyright © 萬盛學電腦網 all rights reserved