C# WIFI连接状态检测的几种方法小结

 更新时间:2026年05月14日 08:59:23   作者:她说彩礼65万  
文章分析了为何在WiFi断开后仍能ping通,并提出了多种检测WiFi状态的方法,包括清除ARP缓存、使用NetworkInterface、WMI及检测SSID等,对比了各种方法的可靠性和速度,建议优先采用NetworkInterface或直接检测SSID的方法,需要的朋友可以参考下

问题分析

1.网关IP ≠ 热点IP

获取到的网关IP(Gateway IP)通常是指默认路由网关,不一定就是直接连接的WiFi热点的IP。例如:

WiFi热点 IP:192.168.1.1
网关 IP:192.168.1.1  (此时相同)

但在复杂网络中可能:
WiFi热点 IP:192.168.1.1
网关 IP:10.0.0.1  (被转发,网关在远端)

2.ARP缓存导致虚假ping成功

当WiFi断掉后,仍然能ping通的主要原因是 ARP缓存

WiFi断掉时序:
时间1: WiFi连接 → ping 192.168.1.1 → 成功 → ARP缓存MAC地址
时间2: WiFi断开连接
时间3: ping 192.168.1.1 → 使用缓存的MAC地址 → 看似成功(但实际上没有发出去)

解决方案

方案1:清除ARP缓存后再ping(验证真实连接)

using System.Diagnostics;

/// <summary>
/// 清除ARP缓存并验证WiFi实际连接状态
/// </summary>
public static bool VerifyWiFiConnection(string targetIP)
{
    try
    {
        // 步骤1:清除ARP缓存
        ProcessStartInfo psi = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = "/c ipconfig /all /flushdns && arp -d",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };
        
        using (Process process = Process.Start(psi))
        {
            process.WaitForExit();
        }
        
        Thread.Sleep(500); // 等待ARP缓存清除
        
        // 步骤2:执行ping验证
        ProcessStartInfo pingPsi = new ProcessStartInfo
        {
            FileName = "ping.exe",
            Arguments = $"-n 1 {targetIP}",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };
        
        using (Process pingProcess = Process.Start(pingPsi))
        {
            string output = pingProcess.StandardOutput.ReadToEnd();
            pingProcess.WaitForExit();
            
            // 检查ping是否成功(Reply from 或 bytes=)
            return output.Contains("Reply from") || output.Contains("bytes=");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}");
        return false;
    }
}

方案2:使用NetworkInterface检测WiFi状态(更可靠)

/// <summary>
/// 检测WiFi是否真正连接(比ping更可靠)
/// </summary>
public static bool IsWiFiConnected()
{
    try
    {
        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        
        foreach (NetworkInterface ni in interfaces)
        {
            // 检查是否为WiFi网卡
            if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 &&
                ni.OperationalStatus == OperationalStatus.Up)
            {
                // 关键:检查 OperationalStatus
                // Up = 连接正常
                // Down = 连接断开
                
                IPInterfaceProperties ipProps = ni.GetIPProperties();
                
                // 额外检查:是否有有效的IP地址
                bool hasValidIP = ipProps.UnicastAddresses
                    .Any(x => x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork &&
                              !IPAddress.IsLoopback(x.Address) &&
                              x.Address.ToString() != "0.0.0.0");
                
                if (hasValidIP)
                {
                    Console.WriteLine($"WiFi已连接: {ni.Name}");
                    Console.WriteLine($"状态: {ni.OperationalStatus}");
                    return true;
                }
            }
        }
        
        Console.WriteLine("WiFi未连接");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}");
        return false;
    }
}

方案3:通过WMI检测WiFi连接状态(最准确)

using System.Management;

/// <summary>
/// 通过WMI检测WiFi实际连接状态
/// </summary>
public static bool IsWiFiReallyConnected()
{
    try
    {
        // 查询网络适配器状态
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=true"
        );
        
        foreach (ManagementObject mo in searcher.Get())
        {
            string description = mo["Description"]?.ToString() ?? "";
            
            if (description.Contains("Wireless") || description.Contains("WiFi"))
            {
                // 检查IP配置是否有效
                object[] ipAddresses = mo["IPAddress"] as object[];
                object[] subnetMasks = mo["IPSubnet"] as object[];
                object[] gateways = mo["DefaultIPGateway"] as object[];
                
                if (ipAddresses != null && ipAddresses.Length > 0 &&
                    gateways != null && gateways.Length > 0)
                {
                    // 再查询网络适配器的物理状态
                    ManagementObjectSearcher adapterSearcher = new ManagementObjectSearcher(
                        $"SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionID='{mo["Description"]}'"
                    );
                    
                    foreach (ManagementObject adapter in adapterSearcher.Get())
                    {
                        // NetEnabled = true 表示真正连接
                        bool isEnabled = (bool)adapter["NetEnabled"];
                        
                        if (isEnabled)
                        {
                            Console.WriteLine($"WiFi真正已连接 (NetEnabled=true)");
                            return true;
                        }
                    }
                }
            }
        }
        
        Console.WriteLine("WiFi未连接");
        return false;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}");
        return false;
    }
}

方案4:检测WiFi的SSID(最直接)

using System.Net.NetworkInformation;
using System.Diagnostics;

/// <summary>
/// 获取当前连接的WiFi SSID(最直接的方式)
/// </summary>
public static string GetConnectedWiFiSSID()
{
    try
    {
        ProcessStartInfo psi = new ProcessStartInfo
        {
            FileName = "netsh",
            Arguments = "wlan show interfaces",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };
        
        using (Process process = Process.Start(psi))
        {
            string output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            
            // 解析输出,查找 "SSID"
            string[] lines = output.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
            foreach (string line in lines)
            {
                if (line.Contains("SSID"))
                {
                    // 提取SSID值
                    string[] parts = line.Split(':');
                    if (parts.Length > 1)
                    {
                        string ssid = parts[1].Trim();
                        if (!string.IsNullOrEmpty(ssid) && ssid != "Not associated")
                        {
                            Console.WriteLine($"当前连接WiFi: {ssid}");
                            return ssid;
                        }
                    }
                }
            }
        }
        
        Console.WriteLine("未连接WiFi");
        return null;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}");
        return null;
    }
}

对比总结

检测方法可靠性速度说明
ping⭐ 低ARP缓存影响,不可靠
NetworkInterface⭐⭐⭐ 高检查OperationalStatus,较可靠
WMI查询⭐⭐⭐⭐ 很高检查NetEnabled标志,最准确
获取SSID⭐⭐⭐⭐⭐ 最高直接查询连接的热点名称,最直接

使用建议

// 完整的WiFi连接检测流程
public static bool CheckWiFiConnection()
{
    // 第一步:检查网络接口状态(快速)
    if (!IsWiFiConnected())
        return false;
    
    // 第二步:获取SSID确认(直接)
    string ssid = GetConnectedWiFiSSID();
    if (string.IsNullOrEmpty(ssid))
        return false;
    
    // 第三步:获取网关IP
    string gatewayIP = GetWiFiGatewayIP();
    Console.WriteLine($"连接的WiFi: {ssid}");
    Console.WriteLine($"网关IP: {gatewayIP}");
    
    return true;
}

推荐用方案2或方案4,不要单纯依赖ping命令。

到此这篇关于C# WIFI连接状态检测的几种方法小结的文章就介绍到这了,更多相关C# WIFI连接状态检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现统计100以内所有素数的个数

    C#实现统计100以内所有素数的个数

    这篇文章介绍了C#实现统计100以内所有素数个数的方法,文中注释非常详细,很适合新手学习。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C#实现的简单随机数产生器功能示例

    C#实现的简单随机数产生器功能示例

    这篇文章主要介绍了C#实现的简单随机数产生器功能,涉及C#简单界面布局、事件响应及随机数生成相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • C# char类型字符转换大小写的实现代码

    C# char类型字符转换大小写的实现代码

    以下是对C#中char类型字符转换大小写的示例代码进行了介绍,需要的朋友可以过来参考下哦
    2013-07-07
  • C#函数式编程中的标准高阶函数详解

    C#函数式编程中的标准高阶函数详解

    这篇文章主要介绍了C#函数式编程中的标准高阶函数详解,本文讲解了何为高阶函数、Map、 Filter、Fold等内容,需要的朋友可以参考下
    2015-01-01
  • C# RichTextBox制作文本编辑器

    C# RichTextBox制作文本编辑器

    这篇文章主要为大家详细介绍了C# RichTextBox制作文本编辑器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 关于C#生成MongoDB中ObjectId的实现方法

    关于C#生成MongoDB中ObjectId的实现方法

    本篇文章小编为大家介绍,关于C#生成MongoDB中ObjectId的实现方法。需要的朋友参考下
    2013-04-04
  • WPF实现2048小游戏

    WPF实现2048小游戏

    这篇文章主要为大家详细介绍了WPF实现2048小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C# dll代码混淆加密的实现

    C# dll代码混淆加密的实现

    本文主要介绍了C# dll代码混淆加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法

    C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法

    这篇文章主要介绍了C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法,本文总结了Convert.ToDateTime(string)、Convert.ToDateTime(string, IFormatProvider)、DateTime.ParseExact()三种方法,需要的朋友可以参考下
    2015-07-07
  • 浅谈C#中对引用类型的误解

    浅谈C#中对引用类型的误解

    这篇文章主要介绍了浅谈C#中对引用类型的误解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论