C#判断网络连接状态代码
本文介绍了在C#应用程序中判断当前网络连接状态的完整实现方案。该方案结合了Windows系统API检测物理网卡或调制解调器连接状态,以及利用Ping协议针对多个外部网站进行连通性验证,从而准确输出网络是否正常、不稳定或完全无连接的结论。
结果与目标
本示例旨在提供一段可在控制台运行的C#代码,用于实时监测和评估网络质量。程序能够区分以下三种典型场景:
- 无连接:本地设备未检测到任何有效的网络连接(既非拨号也非局域网)。
- 网络异常/无响应:本地已联网,但尝试Ping多个目标地址时,失败比例超过30%。
- 网络不稳定/正常:本地已联网,且大部分目标可被成功Ping通。
核心逻辑说明
网络状态的判定分为两个独立的步骤:
- 物理连接检查:通过导入
wininet.dll中的InternetGetConnectedState函数,查询操作系统层面的连接标志位。它使用掩码判断是使用了调制解调器(Modem)还是局域网卡(LAN)。 - 连通性验证:如果物理层有连接,则使用
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(
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













