vista以及更高版本操作系统网络状态实时检测方法
来源:互联网 发布:nba2010总决赛数据 编辑:程序博客网 时间:2024/05/22 11:44
今天有项目需求,需要实时检测网络连接状态,起码要做的和QQ微信差不多,根据网络上以及MSDN提供的一些API,比如InternetGetConnectedState和IsNetworkAlive均没有达到预期效果,或者是有各种各样的问题,比如说API InternetGetConnectedState,这个API就有延时的问题,亲测我的机器延时为5秒,而IsNetworkAlive仅仅只能检测到网线连接,但是不能检测到网络连通,只能抛弃这两个函数。通过不断google和翻看MSDN,终于找到一个实现,即实现Network List manager(NLM)的相关方法和回调即可。
首先,从INetworkListManagerEvents派生一个类,并实现相关COM接口函数
#pragma once#include <atlcom.h>#include <netlistmgr.h>#include <netlistmgr.h>class NetworkEventHandler : public INetworkListManagerEvents{public:NetworkEventHandler(void);virtual ~NetworkEventHandler(void);STDMETHODIMP QueryInterface (REFIID riid, void** pIFace);STDMETHODIMP_(ULONG) AddRef();STDMETHODIMP_(ULONG) Release();STDMETHODIMP ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity);private:long m_lRefCnt;};
cpp:
NetworkEventHandler::NetworkEventHandler(void) : m_lRefCnt(0){}NetworkEventHandler::~NetworkEventHandler(void){}STDMETHODIMP NetworkEventHandler::QueryInterface(REFIID refIID, void** pIFace){*pIFace = NULL;if(refIID == IID_IUnknown || refIID == __uuidof(INetworkListManagerEvents)){*pIFace = (IUnknown*)(INetworkListManagerEvents*)(this);}if (*pIFace == NULL){return E_NOINTERFACE;}((IUnknown*)*pIFace)->AddRef();return S_OK;}STDMETHODIMP_(ULONG) NetworkEventHandler::AddRef(){m_lRefCnt++;return m_lRefCnt;}STDMETHODIMP_(ULONG) NetworkEventHandler::Release(){m_lRefCnt--;if(m_lRefCnt == 0) {delete this;return (0);}return m_lRefCnt;}STDMETHODIMP NetworkEventHandler :: ConnectivityChanged( NLM_CONNECTIVITY NewConnectivity){bool bInternet = false;if((NewConnectivity & NLM_CONNECTIVITY_IPV4_INTERNET) || (NewConnectivity & NLM_CONNECTIVITY_IPV6_INTERNET)){bInternet = true;//网络已经连通,做点啥事}else{//网络已经不通,做点啥事}return S_OK;}
然后注册相关事件即可,
定义
CComPtr<INetworkListManager> m_pNLM;NetworkEventHandler * m_pSink;
DWORD m_dwCookie;
注册:m_pNLM.CoCreateInstance(CLSID_NetworkListManager);m_pSink = new NetworkEventHandler();if (SUCCEEDED (m_pSink->QueryInterface(IID_IUnknown, (void**) &m_pSink))){ AfxConnectionAdvise (m_pNLM, __uuidof(INetworkListManagerEvents), m_pSink, FALSE, &m_dwCookie); // Advising for Events}
最后程序结束,释放:
AfxConnectionUnadvise (m_pNLM, IID_INetworkListManagerEvents, m_pSink, FALSE, m_dwCookie);m_pSink->Release();
当网络连接状态改变时,ConnectivityChanged就会收到通知了
阅读全文
0 0
- vista以及更高版本操作系统网络状态实时检测方法
- 实时检测网络状态
- iOS 实时检测网络状态
- android 实时检测网络状态
- 检测本地网络连接状态断开以及恢复的方法
- IOS开发 实时检测网络状态
- 网络状态检测方法分析
- 网络状态检测方法分析
- 检测网络状态的方法
- 网络状态检测方法分析
- 检测Vista激活状态
- Myeclipse10以及更高版本激活
- iOS之Reachability和AFN实时检测网络状态
- Android 利用BroadcastReceiver实时检测网络状态变化
- 在win8以及更高版本的操作系统中使用SQl Server
- 网络连接状态检测的一个方法
- 网络状态检测方法测试结果
- Android,检测网络状态的方法
- Leetcode 53 Maximum Subarray
- 24.七-断言方法,判断质数
- Kotlin 与ListView的结合
- kingbright LED 知识科普 0603系列 1206系列
- php实现微信公众号授权
- vista以及更高版本操作系统网络状态实时检测方法
- 在一个TextView之中,显示多种颜色字号的文字
- 详解CSS的相对定位和绝对定位
- Ambari离线安装
- pycharm与webstorm 2017 激活破解
- 三种undo/Redo的实现
- SDOI2009晨跑
- Docker个人学习总结
- 图像压缩中的一些概念(码率截取,位平面,码率分配,小波提升)