InternetGetConnectedState
本文提供全流程,中文翻译
Chinar 的初衷是将一种简单的生活方式带给世人
使有限时间 具备无限可能
Chinar —— 心分享、心创新!
助力快速利用 C# 判断用户电脑联网状态
给新手节省宝贵的时间,避免采坑!
Chinar 教程效果:
全文高清图片,点击即可放大观看 (很多人竟然不知道)
1
Intro —— 简介
Unity 引擎提供的 Application.internetReachability
只适用于移动端,在PC端就会出现无论联网与否,都显示联网
鉴于这种情况,Chinar 推荐大家采用C#引用外部库,调用MSDN封装好的函数,来解决!
C++中的 InternetGetConnectedState
—— 获取连接状态
为了便于大家学习, Chinar 已经封装、并简化了代码,附上注释!
2
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 提供一站式《零》基础教程 使有限时间 具备无限可能! |
Chinar 知你所想,予你所求!( Chinar Blog )
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址