判断计算机是否能够连接到Internet
2011-10-13 21:09
281 查看
//判断计算机是否能够连接到Internet的API //wininet.dll是Windows应用程序网络相关模块。该文件隶属%\WINDOWS\SYSTEM32目录下动态库连接文件。该文件不可缺失,属于关键链接库。当文件丢失或者损坏时,届时将无法完成Explorer进程(即桌面以及基于该进程的IE浏览器等,可使用不基于IE浏览器进行访问网络) 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(); }
相关文章推荐
- C# 利用【wininet.dll】判断是否能够连接到Internet
- 判断计算机是否已经连接到Internet
- 判断计算机是否已经连接到Internet
- 判断计算机是否已经连接到Internet
- 翻译:怎样检测你的计算机是否连接到Internet
- InternetCheckConnection 通过尝试连接特定的网址,可以用来判断目前机器是否接通外网
- 判断是否连接到Internet
- C#判断当前计算机是否已经连接网络
- Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名
- 判断本地的电脑是否与Internet网络连接
- python判断计算机是否有网络连接
- android 判断是否真正连接到internet(通过检测网址,需要时间)
- C#使用Ping功能判断网络连接状态或者目标计算机是否开机等
- 判断当前机器是否连接到Internet
- 判断计算机当前的网络是否连接
- android中判断网络是否连接
- 【笔试】Webank 判断4条线是否能够连成平行坐标轴的矩形
- java中判断socket网络远端是否断开连接
- 判断Outlook与Exchange是否正常连接
- 判断网络是否连接