Winform网络异常检测
创建定时器 循环调用检测
// 网络检测
networkTimer.Enabled = true;
networkTimer.Interval = 3000;
networkTimer.Tick += NetworkTimer_Tick;
定时方法 panelControlNetworkError 只是一个 PanelControl 容器 界面要怎么展示 就怎么玩咯
/// <summary>
/// 定时检测网络状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NetworkTimer_Tick(object sender, EventArgs e)
{
Task.Run(() =>
{
// 主要是这个方法 下面的只是枚举值的判断
var status = GetInternetConStatus.GetNetConStatus("baidu.com");
switch (status)
{
case NetStatus.None:
case NetStatus.ModemAccessInternet:
case NetStatus.NetworkCard:
// 注意调用线程 转到UI线程 去执行
SynchronizationContext.Current.Post(d =>
{
if (Context.IsRunTime)
{
panelControlNetworkError.Visible = false;
}
}, null);
break;
case NetStatus.Ununited:
case NetStatus.ModemAccessInternetImpassability:
case NetStatus.NetworkCardImpassability:
// 注意调用线程 转到UI线程 去执行
SynchronizationContext.Current.Post(d =>
{
if (Context.IsRunTime)
{
panelControlNetworkError.Visible = true;
}
}, null);
break;
default:
break;
}
});
}
// 枚举
public enum NetStatus
{
[Description("")] None = 0,
[Description("网络未连接")] Ununited,
[Description("采用调治解调器上网")] ModemAccessInternet,
[Description("采用网卡上网")] NetworkCard,
[Description("采用调治解调器上网,但是联不通指定网络")] ModemAccessInternetImpassability,
[Description("采用网卡上网,但是联不通指定网络")] NetworkCardImpassability,
}
// 先调用系统的API 获取当前网络状态 如果网络错误 再用 Ping 的方式,精准度会比只用 Ping 稍微强一点 但是还是会出现
public static class GetInternetConStatus
{
private const int INTERNET_CONNECTION_MODEM = 1;
private const int INTERNET_CONNECTION_LAN = 2;
[DllImport("winInet.dll")]
private static extern bool InternetGetConnectedState(
ref int dwFlag,
int dwReserved
);
/// <summary>
/// 判断网络的连接状态
/// </summary>
/// <returns>
/// 网络状态(1-->未联网;2-->采用调治解调器上网;3-->采用网卡上网)
///</returns>
public static NetStatus GetNetConStatus(string strNetAddress)
{
int dwFlag = default;
if (!InternetGetConnectedState(ref dwFlag, 0))
{
//没有能连上互联网
return NetStatus.Ununited;
}
if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
{
//采用调治解调器上网,需要进一步判断能否登录具体网站
return PingNetAddress(strNetAddress) ? NetStatus.ModemAccessInternet : NetStatus.ModemAccessInternetImpassability;
}
if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
{
//采用网卡上网,需要进一步判断能否登录具体网站
return PingNetAddress(strNetAddress) ? NetStatus.NetworkCard : NetStatus.NetworkCardImpassability;
}
return NetStatus.None;
}
/// <summary>
/// ping 具体的网址看能否ping通
/// </summary>
/// <param name="strNetAdd"></param>
/// <returns></returns>
private static bool PingNetAddress(string strNetAdd)
{
var ping = new Ping();
bool flag;
try
{
var pr = ping.Send(strNetAdd, 3000);
flag = pr.Status switch
{
IPStatus.TimedOut => false,
IPStatus.Success => true,
_ => false
};
}
catch
{
flag = false;
}
return flag;
}
}
如果有更精准的方式 请留个链接啥的