用C#实现判断网络线缆是否连接好
我需要做一个单个计算机不能上网的时候测试网络故障的软件,中间的一个功能,在网上查了好多没有查到,各位大侠给帮忙提点建议吧
[解决办法]
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("采用网卡上网。");
}
[解决办法]
我写过一个,直接可以用
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();
}