C# WIFI連接狀態(tài)檢測(cè)的幾種方法小結(jié)
問題分析
1.網(wǎng)關(guān)IP ≠ 熱點(diǎn)IP
獲取到的網(wǎng)關(guān)IP(Gateway IP)通常是指默認(rèn)路由網(wǎng)關(guān),不一定就是直接連接的WiFi熱點(diǎn)的IP。例如:
WiFi熱點(diǎn) IP:192.168.1.1 網(wǎng)關(guān) IP:192.168.1.1 (此時(shí)相同) 但在復(fù)雜網(wǎng)絡(luò)中可能: WiFi熱點(diǎn) IP:192.168.1.1 網(wǎng)關(guān) IP:10.0.0.1 (被轉(zhuǎn)發(fā),網(wǎng)關(guān)在遠(yuǎn)端)
2.ARP緩存導(dǎo)致虛假ping成功
當(dāng)WiFi斷掉后,仍然能ping通的主要原因是 ARP緩存:
WiFi斷掉時(shí)序: 時(shí)間1: WiFi連接 → ping 192.168.1.1 → 成功 → ARP緩存MAC地址 時(shí)間2: WiFi斷開連接 時(shí)間3: ping 192.168.1.1 → 使用緩存的MAC地址 → 看似成功(但實(shí)際上沒有發(fā)出去)
解決方案
方案1:清除ARP緩存后再ping(驗(yàn)證真實(shí)連接)
using System.Diagnostics;
/// <summary>
/// 清除ARP緩存并驗(yàn)證WiFi實(shí)際連接狀態(tài)
/// </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:執(zhí)行ping驗(yàn)證
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檢測(cè)WiFi狀態(tài)(更可靠)
/// <summary>
/// 檢測(cè)WiFi是否真正連接(比ping更可靠)
/// </summary>
public static bool IsWiFiConnected()
{
try
{
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface ni in interfaces)
{
// 檢查是否為WiFi網(wǎng)卡
if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 &&
ni.OperationalStatus == OperationalStatus.Up)
{
// 關(guān)鍵:檢查 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($"狀態(tài): {ni.OperationalStatus}");
return true;
}
}
}
Console.WriteLine("WiFi未連接");
return false;
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
return false;
}
}
方案3:通過WMI檢測(cè)WiFi連接狀態(tài)(最準(zhǔn)確)
using System.Management;
/// <summary>
/// 通過WMI檢測(cè)WiFi實(shí)際連接狀態(tài)
/// </summary>
public static bool IsWiFiReallyConnected()
{
try
{
// 查詢網(wǎng)絡(luò)適配器狀態(tài)
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)
{
// 再查詢網(wǎng)絡(luò)適配器的物理狀態(tài)
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:檢測(cè)WiFi的SSID(最直接)
using System.Net.NetworkInformation;
using System.Diagnostics;
/// <summary>
/// 獲取當(dāng)前連接的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($"當(dāng)前連接WiFi: {ssid}");
return ssid;
}
}
}
}
}
Console.WriteLine("未連接WiFi");
return null;
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
對(duì)比總結(jié)
| 檢測(cè)方法 | 可靠性 | 速度 | 說明 |
|---|---|---|---|
| ping | ? 低 | 快 | ARP緩存影響,不可靠 |
| NetworkInterface | ??? 高 | 快 | 檢查OperationalStatus,較可靠 |
| WMI查詢 | ???? 很高 | 中 | 檢查NetEnabled標(biāo)志,最準(zhǔn)確 |
| 獲取SSID | ????? 最高 | 中 | 直接查詢連接的熱點(diǎn)名稱,最直接 |
使用建議
// 完整的WiFi連接檢測(cè)流程
public static bool CheckWiFiConnection()
{
// 第一步:檢查網(wǎng)絡(luò)接口狀態(tài)(快速)
if (!IsWiFiConnected())
return false;
// 第二步:獲取SSID確認(rèn)(直接)
string ssid = GetConnectedWiFiSSID();
if (string.IsNullOrEmpty(ssid))
return false;
// 第三步:獲取網(wǎng)關(guān)IP
string gatewayIP = GetWiFiGatewayIP();
Console.WriteLine($"連接的WiFi: {ssid}");
Console.WriteLine($"網(wǎng)關(guān)IP: {gatewayIP}");
return true;
}
推薦用方案2或方案4,不要單純依賴ping命令。
到此這篇關(guān)于C# WIFI連接狀態(tài)檢測(cè)的幾種方法小結(jié)的文章就介紹到這了,更多相關(guān)C# WIFI連接狀態(tài)檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
gridview的buttonfield獲取該行的索引值(實(shí)例講解)
本篇文章主要介紹了gridview的buttonfield獲取該行的索引值(實(shí)例講解)需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例
這篇文章主要介紹了C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
WPF+SkiaSharp實(shí)現(xiàn)自繪彈幕效果
這篇文章主要為大家詳細(xì)介紹了如何利用WPF和SkiaSharp實(shí)現(xiàn)自制彈幕效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2022-09-09
c#實(shí)現(xiàn)獲取字符串陣列中元素最長(zhǎng)或最短的長(zhǎng)度
下面小編就為大家分享一篇c#實(shí)現(xiàn)獲取字符串陣列中元素最長(zhǎng)或最短的長(zhǎng)度方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12
C#借助Free?Spire.PDF?for?.NET實(shí)現(xiàn)輕松提取PDF文本
在日常辦公和開發(fā)中,從 PDF 文件中提取文本是一項(xiàng)高頻需求,本文將介紹如何使用免費(fèi)庫 Free Spire.PDF for .NET 輕松實(shí)現(xiàn) PDF 文本提取,感興趣的小伙伴可以了解下2026-03-03

