用C#实现判断网络线缆是否连接好 我需要做一个单个计算机不能上网的时候测试网络故障的软件,中间的一个功能,在网上查了好多没有查到,各位大侠给帮忙提点建议吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 win32 API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved); 参数lpdwFlags返回当前网络状态,参数dwReserved依然是保留参数,设置为0即可。 INTERNET_CONNECTION_MODEM 通过调治解调器连接网络 INTERNET_CONNECTION_LAN 通过局域网连接网络 这个函数的功能是很强的。它可以: 1. 判断网络连接是通过网卡还是通过调治解调器 2. 是否通过代理上网 3. 判断连接是On Line还是Off Line 4. 判断是否安装“拨号网络服务” 5. 判断调治解调器是否正在使用 这个win32 API在系统system32文件夹中winInet.dll中 使用这个判断的话,需要在类中这样写: 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 ); //调用的方法(Winform为例,放一个按钮,单击即可): private void button1_Click(object sender, System.EventArgs e){ System.Int32 dwFlag = new int(); if(!InternetGetConnectedState(ref dwFlag, 0)) MessageBox.Show("未连网!"); else if((dwFlag & INTERNET_CONNECTION_MODEM)!=0) MessageBox.Show("采用调治解调器上网。"); else if((dwFlag & INTERNET_CONNECTION_LAN)!=0) MessageBox.Show("采用网卡上网。"); } nternetGetConnectedState():对网络状况不能及时反应IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。 InternetGetConnectedState():对网络状况不能及时反应IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。 额,还是调用c++中的api啊3楼 应该是正解,上次碰到命名管道的问题,c#也没有,稍微一点底层的东西都得用c++解决。 我写过一个,直接可以用public sealed class NetworkHelper { #region 网络状态 /// <summary> /// 监听计时器 /// </summary> private Timer listenTimer; private static NetworkHelper instance; /// <summary> /// 监听间隔 /// </summary> const int LISTEN_TIME_SPAN = 2000; //IsNetworkAlive Description const int NETWORK_ALIVE_LAN = 1; const int NETWORK_ALIVE_WAN = 2; const int NETWORK_ALIVE_AOL = 4; const int FLAG_ICC_FORCE_CONNECTION = 1; private NetworkHelper() { } static NetworkHelper() { instance = new NetworkHelper(); } public static NetworkHelper GetNetworkHelperInstance() { return instance; } /// <summary> /// 检查网络是否连通,有延迟 /// </summary> /// <param name="connectionDescription"></param> /// <param name="reservedValue"></param> [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue); /// <summary> /// /// </summary> /// <param name="lpszUrl">连接饿地址</param> /// <param name="dwFlags">FLAG_ICC_FORCE_CONNECTION</param> /// <param name="dwReserved">0</param> [DllImport("wininet.dll")] private extern static bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved); /// <summary> /// 检查网络是否连通,需要启动服务 /// </summary> /// <param name="connectionDescription"></param> [DllImport("sensapi.dll")] private extern static bool IsNetworkAlive(out int connectionDescription); /// <summary> /// 检查是否能建立Internet连接,VISTA不可用 /// </summary> /// <param name="dest"></param> /// <param name="ptr">0</param> [DllImport("sensapi.dll")] private extern static bool IsDestinationReachable(string dest, IntPtr ptr); /// <summary> /// 互联网是否可用 /// </summary> /// <returns></returns> public bool IsInternetAlive() { int status; //检查网络是否可用 if (IsNetworkAlive(out status)) { //如果WAN可用,检查能否建立连接 //if (status == NETWORK_ALIVE_WAN) //{ if (InternetCheckConnection("http://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) || InternetCheckConnection("http://www.sina.com.cn", FLAG_ICC_FORCE_CONNECTION, 0) || InternetCheckConnection("http://www.163.com", FLAG_ICC_FORCE_CONNECTION, 0)) { return true; //如果能建立连接返回TRUE } else return false; //} //else // return false; } return false; } /// <summary> /// 为NetworkStatusChanged事件处理程序提供数据 /// </summary> public class NetworkChangedEventArgs : EventArgs { public NetworkChangedEventArgs(bool status) { IsNetworkAlive = status; } public bool IsNetworkAlive { get; private set; } } /// <summary> /// 表示NetworkStatusChanged事件的方法 /// </summary> public delegate void NetworkChangedEventHandler(object sender, NetworkChangedEventArgs e); /// <summary> /// 网络状态变更时触发的事件 /// </summary> public event NetworkChangedEventHandler NetworkStatusChanged; /// <summary> /// 网络状态变更时触发的事件 /// </summary> private void OnNetworkStatusChanged(NetworkChangedEventArgs e) { if (NetworkStatusChanged != null) NetworkStatusChanged(this, e); } /// <summary> /// 监听网络状态 /// </summary> public void ListenNetworkStatus(SynchronizationContext context) { //获得当前网络状态,并通知 bool currentStatus = IsInternetAlive(); OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); //启动监听网络状态,2秒钟检查一次,当状态变更时触发事件 listenTimer = new Timer(delegate { bool tmpStatus = IsInternetAlive(); if (currentStatus != tmpStatus) { currentStatus = tmpStatus; context.Post(delegate { OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); },null); } } , null , 0 , LISTEN_TIME_SPAN); } /// <summary> /// 停止监听网络状态 /// </summary> public void CloseListenNetworkStatus() { listenTimer.Dispose(); } 因为有几个API有一定限制,比如有延迟,需要系统支持,需要启动服务,所以我最后选择了InternetCheckConnection ,判断常用网站是否可以登录。当然这个也有一定局限,所以更具情况自行选择吧。 继续问关于GridView中的DropDdownList的问题 怎么把A-21121中间的“-”去掉? 纯粹调查——大家认为C#比VB.net强在哪里 System.Data.OleDb.OleDbException: 找不到可安装的 ISAM 高手帮忙看下为什么出错 组件里不能触发textboxchanged事件吗? using System 为什么一用它就出错??? 关于正则表达式捕获问题,请教 C# 如何显示文件夹下的图片呢? 如何知道要下载文件的大小? 到底怎么创建一个web程序? c#如何调用 FindWindowEx 来获取子控件的句柄 求教SM3算法的C#实现
要用的函数:InternetGetConnectedState
函数原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved);
参数lpdwFlags返回当前网络状态,参数dwReserved依然是保留参数,设置为0即可。
INTERNET_CONNECTION_MODEM 通过调治解调器连接网络
INTERNET_CONNECTION_LAN 通过局域网连接网络
这个函数的功能是很强的。它可以:
1. 判断网络连接是通过网卡还是通过调治解调器
2. 是否通过代理上网
3. 判断连接是On Line还是Off Line
4. 判断是否安装“拨号网络服务”
5. 判断调治解调器是否正在使用
这个win32 API在系统system32文件夹中winInet.dll中
使用这个判断的话,需要在类中这样写: 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
);
//调用的方法(Winform为例,放一个按钮,单击即可):
private void button1_Click(object sender, System.EventArgs e){
System.Int32 dwFlag = new int();
if(!InternetGetConnectedState(ref dwFlag, 0))
MessageBox.Show("未连网!");
else
if((dwFlag & INTERNET_CONNECTION_MODEM)!=0)
MessageBox.Show("采用调治解调器上网。");
else
if((dwFlag & INTERNET_CONNECTION_LAN)!=0)
MessageBox.Show("采用网卡上网。");
}
IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。
IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。
public sealed class NetworkHelper
{
#region 网络状态 /// <summary>
/// 监听计时器
/// </summary>
private Timer listenTimer;
private static NetworkHelper instance; /// <summary>
/// 监听间隔
/// </summary>
const int LISTEN_TIME_SPAN = 2000; //IsNetworkAlive Description
const int NETWORK_ALIVE_LAN = 1;
const int NETWORK_ALIVE_WAN = 2;
const int NETWORK_ALIVE_AOL = 4; const int FLAG_ICC_FORCE_CONNECTION = 1;
private NetworkHelper()
{ } static NetworkHelper()
{
instance = new NetworkHelper();
}
public static NetworkHelper GetNetworkHelperInstance()
{
return instance;
} /// <summary>
/// 检查网络是否连通,有延迟
/// </summary>
/// <param name="connectionDescription"></param>
/// <param name="reservedValue"></param>
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue); /// <summary>
///
/// </summary>
/// <param name="lpszUrl">连接饿地址</param>
/// <param name="dwFlags">FLAG_ICC_FORCE_CONNECTION</param>
/// <param name="dwReserved">0</param>
[DllImport("wininet.dll")]
private extern static bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved); /// <summary>
/// 检查网络是否连通,需要启动服务
/// </summary>
/// <param name="connectionDescription"></param>
[DllImport("sensapi.dll")]
private extern static bool IsNetworkAlive(out int connectionDescription); /// <summary>
/// 检查是否能建立Internet连接,VISTA不可用
/// </summary>
/// <param name="dest"></param>
/// <param name="ptr">0</param>
[DllImport("sensapi.dll")]
private extern static bool IsDestinationReachable(string dest, IntPtr ptr);
/// <summary>
/// 互联网是否可用
/// </summary>
/// <returns></returns>
public bool IsInternetAlive()
{
int status;
//检查网络是否可用
if (IsNetworkAlive(out status))
{
//如果WAN可用,检查能否建立连接
//if (status == NETWORK_ALIVE_WAN)
//{
if (InternetCheckConnection("http://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) ||
InternetCheckConnection("http://www.sina.com.cn", FLAG_ICC_FORCE_CONNECTION, 0) ||
InternetCheckConnection("http://www.163.com", FLAG_ICC_FORCE_CONNECTION, 0))
{
return true; //如果能建立连接返回TRUE
}
else
return false;
//}
//else
// return false;
}
return false;
} /// <summary>
/// 为NetworkStatusChanged事件处理程序提供数据
/// </summary>
public class NetworkChangedEventArgs : EventArgs
{
public NetworkChangedEventArgs(bool status)
{
IsNetworkAlive = status;
} public bool IsNetworkAlive
{
get;
private set;
}
} /// <summary>
/// 表示NetworkStatusChanged事件的方法
/// </summary>
public delegate void NetworkChangedEventHandler(object sender, NetworkChangedEventArgs e); /// <summary>
/// 网络状态变更时触发的事件
/// </summary>
public event NetworkChangedEventHandler NetworkStatusChanged; /// <summary>
/// 网络状态变更时触发的事件
/// </summary>
private void OnNetworkStatusChanged(NetworkChangedEventArgs e)
{
if (NetworkStatusChanged != null)
NetworkStatusChanged(this, e);
}
/// <summary>
/// 监听网络状态
/// </summary>
public void ListenNetworkStatus(SynchronizationContext context)
{
//获得当前网络状态,并通知
bool currentStatus = IsInternetAlive();
OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); //启动监听网络状态,2秒钟检查一次,当状态变更时触发事件
listenTimer = new Timer(delegate
{
bool tmpStatus = IsInternetAlive();
if (currentStatus != tmpStatus)
{
currentStatus = tmpStatus;
context.Post(delegate { OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); },null);
}
}
, null
, 0
, LISTEN_TIME_SPAN); }
/// <summary>
/// 停止监听网络状态
/// </summary>
public void CloseListenNetworkStatus()
{
listenTimer.Dispose();
}
InternetCheckConnection ,判断常用网站是否可以登录。当然这个也有一定局限,所以更具情况自行选择吧。