C#判断联网状态检查电脑联网状态

简介: C#判断检查联网状态-判断Unity Window PC电脑联网状态 本文提供全流程,中文翻译 Unity判断联网状态,适用于所有平台 助力快速利用 C# 判断用户电脑网状态 为新手节省宝贵的时间,避免采坑! Unity 引擎提供的 Application.

Chinar blog www.chinar.xin

InternetGetConnectedState


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

Chinar 的初衷是将一种简单的生活方式带给世人

使有限时间 具备无限可能

Chinar —— 心分享、心创新!

助力快速利用 C# 判断用户电脑联网状态

给新手节省宝贵的时间,避免采坑!


Chinar 教程效果:
0_Chinar


全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Intro —— 简介


Unity 引擎提供的 Application.internetReachability 只适用于移动端,在PC端就会出现无论联网与否,都显示联网

鉴于这种情况,Chinar 推荐大家采用C#引用外部库,调用MSDN封装好的函数,来解决!

C++中的 InternetGetConnectedState —— 获取连接状态

为了便于大家学习, Chinar 已经封装、并简化了代码,附上注释!
举个例子

Microsoft 官方文档

Unity 移动端专用 API


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

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

相关文章
|
3月前
|
存储 传感器 监控
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
54 0
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
237 0
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
|
C# Windows
用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
原文:用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠 简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠。 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.
3312 0
|
存储 C#
C#修改电脑桌面图
C#修改电脑桌面图
111 0
C# 获取电脑MAC地址,IP地址,物理内存,CPU序列号,硬盘ID..........................
上班很忙,自己做个记录 代码如下: 需要引入:System.Management 代码如下: using System; using System.Collections.Generic; using System.
1471 0
|
C# 数据安全/隐私保护
C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
原文:C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型) 在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串。 1、硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个硬盘的标识;但是有时候发现,同事的电脑硬盘序列号有重复的。
1444 0
|
C#
【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
原文:【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHookEx一直返回0,导致Hook设置失败,有时候调成Release模式又是正常的。
1249 0
|
C# Shell API
【C#】获取"我的电脑"的名字,如This PC、这台计算机
原文:【C#】获取"我的电脑"的名字,如This PC、这台计算机 注意:这里获取的【我的电脑】的名字,不是机器的名字。
1001 0
|
C#
c#监测电脑状态
原文:c#监测电脑状态 1 public class DeviceMonitor 2 { 3 4 static readonly PerformanceCounter cpuCounter = new PerformanceCounter("Proces...
1040 0