天天看點

C#判斷聯網狀态檢查電腦聯網狀态123支援

Chinar blog :www.chinar.xin

InternetGetConnectedState

本文提供全流程,中文翻譯

Chinar 的初衷是将一種簡單的生活方式帶給世人

使有限時間 具備無限可能

Chinar —— 心分享、心創新!

助力快速利用 C# 判斷使用者電腦聯網狀态

給新手節省寶貴的時間,避免采坑!

Chinar 教程效果:

C#判斷聯網狀态檢查電腦聯網狀态123支援

全文高清圖檔,點選即可放大觀看 (很多人竟然不知道)

1

Intro —— 簡介

Unity 引擎提供的

Application.internetReachability

隻适用于移動端,在PC端就會出現無論聯網與否,都顯示聯網

鑒于這種情況,Chinar 推薦大家采用C#引用外部庫,調用MSDN封裝好的函數,來解決!

C++中的

InternetGetConnectedState

—— 擷取連接配接狀态

為了便于大家學習, Chinar 已經封裝、并簡化了代碼,附上注釋!

C#判斷聯網狀态檢查電腦聯網狀态123支援
Microsoft 官方文檔 Unity 移動端專用 API

2

Simplification —— 簡化代碼

簡化代碼,直接使用 —— 廢話不多說直接貼代碼

C#判斷聯網狀态檢查電腦聯網狀态123支援
using UnityEngine;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using Ping = System.Net.NetworkInformation.Ping;


/// <summary>
/// 簡化
/// 封裝函數 —— 檢測本地網絡連結狀态
/// </summary>
public class ChinarWeb : MonoBehaviour
{
    [DllImport("winInet.dll")]                                                            //引用外部庫
    private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved); //庫中函數


    void Start()
    {
        ChinarPing("www.chinar.xin");
    }


    void Update()
    {
        IsConnectedInternet();
    }


    /// <summary>
    /// 判斷本地的連接配接狀态
    /// </summary>
    private static bool IsConnectedInternet()
    {
        int dwFlag = new int();
        if (!InternetGetConnectedState(ref dwFlag, 0))
        {
            PrintR("目前沒有聯網,請您先聯網後再進行操作!");
            if ((dwFlag & 0x14) == 0) return false;
            Debug.LogWarning("本地系統處于脫機模式。");
            return false;
        }
        else
        {
            if ((dwFlag & 0x01) != 0)
            {
                Print("數據機上網。");
                return true;
            }
            else if ((dwFlag & 0x02) != 0)
            {
                Print("網卡上網。");
                return true;
            }
            else if ((dwFlag & 0x04) != 0)
            {
                Print("代理伺服器上網。");
                return true;
            }
            else if ((dwFlag & 0x40) != 0)
            {
                Print("雖然可以聯網,但可能連結也可能不連接配接。");
                return true;
            }
        }

        return false;
    }


    /// <summary>
    /// Chinar 閃亮輸出
    /// </summary>
    public static void Print(string str)
    {
        Debug.Log($"<b><color=lime><size={12}>{str}</size></color></b>");
    }


    /// <summary>
    /// Chinar 警告輸出
    /// </summary>
    public static void PrintR(string str)
    {
        Debug.Log($"<b><color=red><size={12}>{str}</size></color></b>");
    }


    /// <summary>
    /// Ping指令檢測網絡是否暢通
    /// </summary>
    /// <param name="url">URL位址</param>
    /// <returns>是否ping通</returns>
    public static bool ChinarPing(string url)
    {
        bool isSucceed = true;
        Ping ping      = new Ping();
        try
        {
            var pingReply = ping.Send(url);
            if (pingReply != null && pingReply.Status != IPStatus.Success)
            {
                isSucceed = false;
            }

            if (pingReply != null) print("Ping 網址:<" + url + ">------狀态:" + pingReply.Status);
        }
        catch
        {
            isSucceed = false;
        }

        return isSucceed;
    }
}           

3

Detailed Comments —— 詳細注釋

注釋詳細,一看就明白

C#判斷聯網狀态檢查電腦聯網狀态123支援
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using UnityEngine;
using Ping = System.Net.NetworkInformation.Ping;


/// <summary>
/// 詳細
/// 封裝函數 —— 檢測本地網絡連結狀态
/// </summary>
public class ChinarWebDetail : MonoBehaviour
{
    public const  int INTERNET_CONNECTION_MODEM      = 0x01; //數據機連接配接到 Internet
    public const  int INTERNET_CONNECTION_LAN        = 0x02; //區域網路網卡連接配接到 Internet
    public const  int INTERNET_CONNECTION_PROXY      = 0x04; //代理伺服器連接配接到 Internet
    private const int INTERNET_RAS_INSTALLED         = 0x08; //已安裝 RAS
    public const  int INTERNET_CONNECTION_OFFLINE    = 0x14; //脫機模式
    public const  int INTERNET_CONNECTION_CONFIGURED = 0x40; //具有到 Internet 的有效連接配接,但它目前可能連接配接也可能不連接配接


    [DllImport("winInet.dll")]                                                            //引用外部庫
    private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved); //庫中函數


    void Start()
    {
        ChinarPing(new[] {"www.chinar.xin,www.baidu.com"}, out var errorNum);
        print("失敗個數:" + errorNum);
    }


    void Update()
    {
        LocalConnectionStatus();
    }


    /// <summary>
    /// 判斷本地的連接配接狀态
    /// </summary>
    /// <returns></returns>
    private static bool LocalConnectionStatus()
    {
        int dwFlag = new int();
        if (!InternetGetConnectedState(ref dwFlag, 0))
        {
            print("未連網!");
            if ((dwFlag & INTERNET_CONNECTION_OFFLINE) == 0) return false;
            print("本地系統處于脫機模式。");
            return false;
        }

        if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
        {
            print("數據機上網。");
            return true;
        }

        if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
        {
            print("網卡上網。");
            return true;
        }

        if ((dwFlag & INTERNET_CONNECTION_PROXY) != 0)
        {
            print("代理伺服器上網。");
            return true;
        }

        if ((dwFlag & INTERNET_CONNECTION_CONFIGURED) != 0)
        {
            print("雖然可以聯網,但可能連結也可能不連接配接。");
            return true;
        }

        return false;
    }


    /// <summary>
    /// Ping指令檢測網絡是否暢通
    /// </summary>
    /// <param name="urls">URL資料</param>
    /// <param name="errorCount">ping時連接配接失敗個數</param>
    /// <returns>是否ping通</returns>
    public static bool ChinarPing(string[] urls, out int errorCount)
    {
        bool isSucceed = true;
        Ping ping      = new Ping();
        errorCount = 0;
        try
        {
            for (int i = 0; i < urls.Length; i++)
            {
                var pingReply = ping.Send(urls[i]);
                if (pingReply != null && pingReply.Status != IPStatus.Success)
                {
                    isSucceed = false;
                    errorCount++;
                }

                if (pingReply != null) print("Ping 網址:<" + urls[i] + ">------狀态:" + pingReply.Status);
            }
        }
        catch
        {
            isSucceed  = false;
            errorCount = urls.Length;
        }

        return isSucceed;
    }
}           

支援

May Be —— 開發者,總有一天要做的事!

擁有自己的伺服器,無需再找攻略

Chinar 提供一站式《零》基礎教程

使有限時間 具備無限可能!

Chinar 知你所想,予你所求!( Chinar Blog )

END

本部落格為非營利性個人原創,除部分有明确署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究

對于需要複制、轉載、連結和傳播部落格文章或内容的,請及時和本部落客進行聯系,留言,Email: [email protected]

對于經本部落客明确授權和許可使用文章及内容的,使用時請注明文章或内容出處并注明網址