|
在VC++/MFC中检测网络中断并实现阻塞等待,可通过以下方案实现: 网络状态检测核心方法
使用IsNetworkAlive()函数检测基础网络连接状态,该函数通过Sensapi.h头文件提供6。配合循环检测机制,当网络中断时触发等待逻辑:
- #include <Sensapi.h>
- #pragma comment(lib, "Sensapi.lib")
复制代码
阻塞等待实现
采用Sleep()函数结合消息泵处理,避免界面卡死。通过PeekMessage维持消息循环运转4: - while (!IsNetworkAlive(&dwFlags)) {
- Sleep(1000); // 每秒检测一次
- if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
- }
复制代码
高精度延时控制
若需更精确的等待间隔,可替换Sleep为WaitForSingleObject配合事件对象,精度可达毫秒级25。
完整实现代码示例:
- #include <windows.h>
- #include <Sensapi.h>
- #pragma comment(lib, "Sensapi.lib")
- bool CheckNetworkWithRetry(int maxRetry = 60) {
- DWORD dwFlags;
- int retryCount = 0;
- MSG msg;
-
- while (retryCount++ < maxRetry) {
- if (IsNetworkAlive(&dwFlags)) return true;
-
- Sleep(1000);
- while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
- }
- return false;
- }
复制代码- 通过IsNetworkAlive检测物理/逻辑网络连接状态
- 内置消息泵处理防止UI冻结
- 可配置最大重试次数控制等待时长
- 返回布尔值指示最终网络状态
注意事项: - 企业网络环境需考虑代理服务器状态检测6
- 长时间阻塞应添加用户取消机制
- 工业控制场景建议结合ping命令验证具体IP可达性
|
|