InternetGetConnectedState
本文提供全流程,中文翻譯
Chinar 的初衷是将一種簡單的生活方式帶給世人
使有限時間 具備無限可能
Chinar —— 心分享、心創新!
助力快速利用 C# 判斷使用者電腦聯網狀态
給新手節省寶貴的時間,避免采坑!
Chinar 教程效果:
全文高清圖檔,點選即可放大觀看 (很多人竟然不知道)
1
Intro —— 簡介
Unity 引擎提供的
Application.internetReachability
隻适用于移動端,在PC端就會出現無論聯網與否,都顯示聯網
鑒于這種情況,Chinar 推薦大家采用C#引用外部庫,調用MSDN封裝好的函數,來解決!
C++中的
InternetGetConnectedState
—— 擷取連接配接狀态
為了便于大家學習, Chinar 已經封裝、并簡化了代碼,附上注釋!
Microsoft 官方文檔 Unity 移動端專用 API2
Simplification —— 簡化代碼
簡化代碼,直接使用 —— 廢話不多說直接貼代碼
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 —— 詳細注釋
注釋詳細,一看就明白
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 提供一站式《零》基礎教程 使有限時間 具備無限可能! |
END
本部落格為非營利性個人原創,除部分有明确署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究
對于需要複制、轉載、連結和傳播部落格文章或内容的,請及時和本部落客進行聯系,留言,Email: [email protected]
對于經本部落客明确授權和許可使用文章及内容的,使用時請注明文章或内容出處并注明網址