C#判断网络连接状态代码

七月
七月
发布时间:2026-10-14 | 6人浏览过
原创

本文介绍了在C#应用程序中判断当前网络连接状态的完整实现方案。该方案结合了Windows系统API检测物理网卡或调制解调器连接状态,以及利用Ping协议针对多个外部网站进行连通性验证,从而准确输出网络是否正常、不稳定或完全无连接的结论。

结果与目标

本示例旨在提供一段可在控制台运行的C#代码,用于实时监测和评估网络质量。程序能够区分以下三种典型场景:

  • 无连接:本地设备未检测到任何有效的网络连接(既非拨号也非局域网)。
  • 网络异常/无响应:本地已联网,但尝试Ping多个目标地址时,失败比例超过30%。
  • 网络不稳定/正常:本地已联网,且大部分目标可被成功Ping通。

核心逻辑说明

网络状态的判定分为两个独立的步骤:

  1. 物理连接检查:通过导入 wininet.dll 中的 InternetGetConnectedState 函数,查询操作系统层面的连接标志位。它使用掩码判断是使用了调制解调器(Modem)还是局域网卡(LAN)。
  2. 连通性验证:如果物理层有连接,则使用 Ping 对象向一组预设的URL发送回显请求,统计成功返回 IPStatus.Success 的比例。

C# 代码实现

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.NetworkInformation;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(string[] args)
        {
            // 定义需要检测的网络目标列表
            string url = "www.baidu.com;www.sina.com;www.cnblogs.com;www.google.com;www.163.com;www.csdn.com";
            string[] urls = url.Split(new char[] { ';' });
            
            // 执行网络状态检测
            CheckServeStatus(urls);

            Console.ReadKey();
        }

        /// <summary>
        /// 检测网络连接状态
        /// </summary>
        public static void CheckServeStatus(string[] urls)
        {
            int errCount = 0;//ping时连接失败个数

            // 第一步:判断本地是否有线或无线连接
            if (!LocalConnectionStatus())
            {
                Console.WriteLine("网络异常~无连接");
            }
            // 第二步:本地有连接,进一步检测是否通畅
            else if (!MyPing(urls, out errCount))
            {
                // 计算失败率,大于等于30%视为严重异常
                if ((double)errCount / urls.Length >= 0.3)
                {
                    Console.WriteLine("网络异常~连接多次无响应");
                }
                else
                {
                    Console.WriteLine("网络不稳定");
                }
            }
            else
            {
                Console.WriteLine("网络正常");
            }
        }

        #region 网络检测底层支持

        private const int INTERNET_CONNECTION_MODEM = 1;
        private const int INTERNET_CONNECTION_LAN = 2;

        [System.Runtime.InteropServices.DllImport("winInet.dll")]
        private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved);

        /// <summary>
        /// 判断本地的物理连接状态
        /// </summary>
        private static bool LocalConnectionStatus()
        {
            System.Int32 dwFlag = new Int32();
            if (!InternetGetConnectedState(ref dwFlag, 0))
            {
                Console.WriteLine("LocalConnectionStatus--未连网!");
                return false;
            }
            else
            {
                if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
                {
                    Console.WriteLine("LocalConnectionStatus--采用调制解调器上网。");
                    return true;
                }
                else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
                {
                    Console.WriteLine("LocalConnectionStatus--采用网卡上网。");
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 使用 Ping 命令检测网络是否畅通
        /// </summary>
        /// <param name="urls">URL数据</param>
        /// <param name="errorCount">ping时连接失败个数</param>
        /// <returns>全部Ping通返回true,否则返回false</returns>
        public static bool MyPing(string[] urls, out int errorCount)
        {
            bool isconn = true;
            Ping ping = new Ping();
            errorCount = 0;
            try
            {
                PingReply pr;
                for (int i = 0; i < urls.Length; i++)
                {
                    pr = ping.Send(urls[i]);
                    if (pr.Status != IPStatus.Success)
                    {
                        isconn = false;
                        errorCount++;
                    }
                    Console.WriteLine("Ping " + urls[i] + "    " + pr.Status.ToString());
                }
            }
            catch
            {
                isconn = false;
                errorCount = urls.Length;
            }
            return isconn;
        }

        #endregion
    }
}

关键类库说明

  • System.Net.NetworkInformation.Ping:位于 .NET 基础库中,无需额外引用即可用于发送ICMP数据包。
  • IPStatus:枚举类型,Success 表示接收到了目标主机的回复。
  • DllImport(
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表