再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)

2023-11-15

上一篇   Qt实现Rasdial宽带拨号  讲解了下最简单的宽带拨号方式。但是在实际项目开发中,发现,这种做法是不好的。效率低,有时拨号失败。而且上一回。我们是采用异步拨号来实现,这个做法是不行的。我们需要实现同步拨号。 那么我们应该借助api函数:   

DWORD   WaitForSingleObject( HANDLE   hHandle, DWORD  dwMilliseconds);     

以下是百度百科的解释,更详细的可以参考msdn

hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到 hHandle标记的对象被触发,或者时间到了。如果 dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果 dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。
利用这个函数,我们可以实现同步拨号。但是这样做还不够,我们不能让这个可能耗时的操作来影响我们的gui线程。所以,我们需要把它放到单独一条线程运行。在这个线程里面实现断网和拨号。拨号后通知主线程就可以了。但是,我们需要检测拨号成功了没有。 好。进入第二个问题。
怎么判断当前网络是否运行连接成功? 第一做法就是查msdn。。然后找到了这个函数
[cpp]  view plain  copy
  1. BOOL InternetGetConnectedStateEx(  
  2.   LPDWORD lpdwFlags,  
  3.   LPTSTR lpszConnectionName,  
  4.   DWORD dwNameLen,  
  5.   DWORD dwReserved  
  6. );  
具体的依然参考msdn library。我们这里只说下怎么判断宽带连接是否连接成功。按照msdn的说法。我们这样写就可以了。 bool ret =  InternetGetConnectedStateExA (0, “宽带连接”, 0, 0) .  只要判断下ret的bool值就可以了。用了几次后,我发现这样做根本就不靠谱呀。在企业开发中,有种比较常用的判断网络是否连接成功的方法是通过访问指定的外网和内网。公司的服务器上单独开一个接口用来判断。。捧着学习的态度,我决定用用别的api来解决。依然是借助api。这次我直接搜索RasDial。。结果,让我惊讶了下;。。真的有这个函数。通过这个函数可以直接拨号。为了追求效率,我决定放弃调用cmd命令,毕竟效率不高。我们来看下
[cpp]  view plain  copy
  1. DWORD RasDial(  
  2.   LPRASDIALEXTENSIONS lpRasDialExtensions,  
  3.   LPCTSTR lpszPhonebook,  
  4.   LPRASDIALPARAMS lpRasDialParams,  
  5.   DWORD dwNotifierType,  
  6.   LPVOID lpvNotifier,  
  7.   LPHRASCONN lphRasConn  
  8. );  

老话,具体的请看msdn。总觉得这些api什么的,msdn已经讲解的很好了。这里给出qt如何使用这个函数。添加头文件 
#include <ras.h>   记得添加lib  #pragma comment(lib, "Rasapi32.lib");
[cpp]  view plain  copy
  1. bool MRasdial::reConnect()  
  2. {  
  3.     // 重新拨号函数  
  4.     RASDIALPARAMS rasParam;  
  5.     ZeroMemory(&rasParam, sizeof(RASDIALPARAMS));  
  6.     rasParam.dwSize = sizeof (RASDIALPARAMS);  
  7.     wcscpy(rasParam.szEntryName,L"ADSL" );  
  8.     wchar_t userName[100] = L"", userPass[100] = L"";  
  9.     m_UserName.toWCharArray(userName);  
  10.     m_UserPass.toWCharArray(userPass);  
  11.     wcscpy(rasParam.szUserName , userName);  
  12.     wcscpy(rasParam.szPassword , userPass);  
  13.   
  14.     HRASCONN handle = NULL; // 注意,记得初始化。  
  15.     int res = RasDial(0,0, &rasParam, 0, 0, &handle);  
  16.   
  17.     if (res != ERROR_SUCCESS) {  
  18.   
  19.         qDebug()<<"dial error:"<< res;  
  20.   
  21.         // 出错 采用断开连接的方法尝试再次连接  
  22.         // 前提需要保障用户账号名和密码是正确的  
  23.         RasHangUp (handle);  
  24.         return false// 返回错误 待会再连接  
  25.     }  
  26.   
  27.     qDebug()<<"dial is over";  
  28.     return true;  
  29. }  

这边注意一个细节,我是怎么处理拨号出错的。为了防止宽带拨号处于宽带拨号中,我们需要借助 RasHangUp(HRASCONN handle); 来断开连接。。好了。现在回到第二个问题,该怎么判断网络连接状态。这个需要借助 RasEnumConnections 函数来枚举出当前连接的句柄信息。使用代码例子如下:
[cpp]  view plain  copy
  1. bool MRasdial::isADSLConnect()  
  2. {  
  3.     // 通过枚举获取当前连接的ADSL的句柄  
  4.     RASCONN rasconnArr[20]; // 存放多个结构体  
  5.     DWORD dwRasConSize =  20* sizeof(RASCONN);  
  6.     DWORD dwRasConCount = 0;  
  7.     rasconnArr[0].dwSize = sizeof (RASCONN);  
  8.   
  9.     if (!RasEnumConnections(rasconnArr, &dwRasConSize, &dwRasConCount)) {  
  10.   
  11.         for (int i =0; i< (int)dwRasConCount; ++i) {  
  12.   
  13.             if (wcscmp(rasconnArr[i].szEntryName, L"ADSL") == 0) {  
  14.   
  15.                 return true;  
  16.             }  
  17.         }  
  18.     }  
  19.     return false;  
  20. }  
这里我就是要判断当前连接是否有ADSL这个用户名。 这种做法就可以更好的判断当前用户名为ADSL的宽带账号是否连接成功。 最后,需要说明的是,在断开网络和连接网络,最好有一定的时间间隔。我的做法如下,仅供参考
[cpp]  view plain  copy
  1. void MRasdial::reConToNet()  
  2. {  
  3.     do {  
  4.         disconnect(); // 断开网络  
  5.         Sleep(4000);  
  6.     } while (true == isADSLConnect());  
  7.   
  8.     qDebug()<<"net is dis";  
  9.     // 连接网络  
  10.     do {  
  11.         if (true == reConnect())  
  12.             break;  
  13.         qDebug()<<"connect to net";  
  14.         Sleep(4000);  
  15.     } while (false == isADSLConnect());  
  16.   
  17.     emit reNetSuccess();  
  18. }  
最后这里提供几个相关信息的链接:

关于RasDial拨号错误代码的详解: Routing and Remote Access Error Codes

关于拨号函数RasDial详解:   RasDial
from:http://blog.csdn.net/wu5151/article/details/47345399





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案) 的相关文章

  • JVM 垃圾回收

    JVM 垃圾回收 写在前面 本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡 两种方法 简单的介绍一下强引用 软引用 弱引用 虚引用 虚引用与软引用和弱引用的区别 使用软引用能带来的好处 如何判断一个常量是废弃常量 如何判断一个
  • Linux基线检查( 一)

    什么是基线 即安全基线配置 诸如操作系统 中间件和数据库的一个整体配置 这个版本中各项配置都符合安全方面的标准 比如在系统安装后需要按安全基线标准 将新机器中各项配置调整到一个安全 高效 合理的数值 风险分类 系统 等保三级 CentOS
  • linux 普通用户 Cannot create VM thread. Out of system resources.

    在linux系统下开发 使用普通用户进行应用部署 出现JVM内存问题如下 Error occurred during initialization of VM Cannot create VM thread Out of system re
  • Basic Level 1023 组个最小数 (20分)

    题目 给定数字 0 9 各若干个 你可以以任意顺序排列这些数字 但必须全部使用 目标是使得最后得到的数尽可能小 注意 0 不能做首位 例如 给定两个 0 两个 1 三个 5 一个 8 我们得到的最小的数就是 10015558 现给定数字 请
  • Python学习笔记第六十四天(Matplotlib 网格线)

    Python学习笔记第六十四天 Matplotlib 网格线 普通网格线 样式网格线 后记 Matplotlib 网格线 我们可以使用 pyplot 中的 grid 方法来设置图表中的网格线 grid 方法语法格式如下 matplotlib
  • 系统架构设计师(第二版)学习笔记----信息系统基础

    原文链接 系统架构设计师 第二版 学习笔记 信息系统基础 文章目录 一 信息系统概述 1 1 信息系统的5个基本功能 1 2 信息系统发展阶段 1 3 初始阶段的主要特点 1 4 传播阶段的主要特点 1 5 控制阶段的主要特点 1 6 集成
  • lock_guard和unique_lock

    锁 锁用来在多线程访问同一个资源时防止数据竞险 保证数据的一致性访问 多线程本来就是为了提高效率和响应速度 但锁的使用又限制了多线程的并行执行 这会降低效率 但为了保证数据正确 不得不使用锁 它们就是这样纠缠 本文主要讨论 c 11 中的两
  • 网络安全工程师的职责 103.219.28.X

    网络安全工程师是专门从事网络安全防护 攻击和事故处理等工作的技术人员 其主要职责包括 评估和分析网络漏洞和威胁情况 制定网络安全策略和方案 开发和实施安全解决方案 监控和维护网络安全系统 应对网络攻击和事故等 他们需要掌握网络安全技术 网络
  • DateTime关于时区的学习

    一 时区的概念 首先来了解时区的概念 为了解决世界不同各地在时间上的差异 人们定义了时区 时区是地球上的区域使用同一个时间定义 人们将时区分为24个 它们是中时区 零时区 东1 12区 西1 12区 每个时区横跨经度15度 时间正好是1小时
  • SQL Server临时表

    创建临时表 方法一 create table 临时表名 字段1 约束条件 字段2 约束条件 create table 临时表名 字段1 约束条件 字段2 约束条件 方法二 select into 临时表名 from 你的表 select i
  • 【JAVA设计模式】之桥接模式(BridgePattern)

    桥接模式的作用是将两样东西连接起来 比如桥梁把河的两岸连接起来 桥接模式把 类的功能层次结构 和 类的实现层次结构 连接起来 类的层次结构 类的功能层次 父类通过定义抽象方法来定义接口API 类的实现层次 子类通过实现具体方法来实现接口AP
  • FP64、FP32、FP16、FP8简介

    目录 1 单精度浮点数FP32的表示 2 半精度浮点数FP16的表示 3 双精度浮点数FP64的表示 4 FP8 5 写在最后 1 单精度浮点数FP32的表示 浮点数由三部分组成 符号位 指数部分 尾数部分 以单精度浮点数为例 如图所示 符
  • 好多粉使用百度OCPC api提交后如何手动选择有效咨询回传?

    推广每天会有复制 虽然绝大部分是正常的数据 但也有可能有的是同行刷的 有的是没有添加成功的数据 如果不处理 会造成无效数据上传 只能投放的AI可能就要被某些别有用心的人玩坏了 所以我们为解决这个痛点 开发了手动回传功能 并且系统自动帮你标识

随机推荐

  • VS2019现有项目添加Qt界面

    目录 Qt安装教程 Qt下载 Qt安装 VS Qt插件 配置Qt插件 配置包含目录及链接器 添加QT界面 添加UI界面 配置文件属性 编译UI文件 添加 h和 cpp文件 简单运行测试 双击ui文件打开Qt Designer闪退问题 与VS
  • c++实现霍夫曼编码

    c 实现霍夫曼编码 计算信源的熵 平均码长 编码效率 冗余度与压缩比 考虑到指针可能对新手不太友好 这里用的是vector容器 用法类似数组 可以动态扩容 存储树形结构 大致原理就是n号结点的左右子树分别是2n和2n 1号结点 Huffma
  • XMPP客户端库Smack 4.1.4版官方开发文档之五

    本文转载自 博客主页 http blog csdn net chszs 五 名单Roster和在线状态Presence 名单可以让你跟踪其他用户是否在线 而且名单可以让你把用户组织到群组 比如朋友群或工作群 而其它的即时通信IM系统则把名单
  • 7个高频出现的面试题

    收集了2022年所有学生的面试题后 我整理出了7个高频出现的面试题 一起来看看 高频问题1 请自我介绍下 高频问题2 请介绍下最近做过的项目 高频问题3 请介绍下你印象深刻的bug 高频问题4 Fiddler工具怎么使用的 高频问题5 说一
  • 判断是否为数字的两种办法

    今天在写angular的ts中碰到一个问题 就是需要判断用户id是否是number类型还是uuid 在这里我采用了两种办法 1 使用typeof 判断是什么类型 if typeof res userInfo id number alert
  • sar 命令

    NAME sar Collect report or save system activity information SYNOPSIS sar A b B C d h i interval m p q r R S t u ALL v V
  • 2.2 SSD之地址映射

    LBA Logical Block Address 表示用户操作 读写 数据的位置 PBA Physics Block Address 表示数据在硬盘的真实位置 在HDD时代 数据可以覆盖写 LBA和PBA直接对应不会更改 但是SSD时代
  • leetcode-453. 最小操作次数使数组元素相等-js

    题目 代码 关键 每次操作使 n 1 个元素增加 1 相当于使1个元素减小 1 所以算出每个元素减小到最小元素的次数即可 var minMoves function nums const minNum Math min nums retur
  • BootStrap-table 复选框默认选中(checkbox)

    BootStrap table 复选框默认选中 checkbox bootstrap table colums 写法 var columns field checked checkbox true formatter stateFormat
  • 基于深度学习的人脸识别综述

    本文转载自 https xraft github io 2018 03 21 FaceRecognition 作者 Caleb Ge 葛政 如有侵权请告知删除 下文中的 我 均为原文作者 另附有查找的其他参考链接 论文介绍方面链接 1 ht
  • 第三章-Python中的数据类型

    欢迎来到python的世界 博客主页 卿云阁 欢迎关注 点赞 收藏 留言 本文由卿云阁原创 本阶段属于练气阶段 希望各位仙友顺利完成突破 首发时间 2021年3月14日 希望可以和大家一起完成进阶之路 作者水平很有限 如果发现错误 请留言轰
  • ubuntu下编译问题集锦

    1 DSO missing from command line 一般是库链接顺序不对 将依赖于其他库的lib放在前面 库放在后面就行 2 fatal error ceres ceres h No such file or directory
  • CTF中那些脑洞大开的编码和加密

    0x00 前言 正文开始之前先闲扯几句吧 玩CTF的小伙伴也许会遇到类似这样的问题 表哥 你知道这是什么加密吗 其实CTF中脑洞密码题 非现代加密方式 一般都是各种古典密码的变形 一般出题者会对密文进行一些处理 但是会给留一些线索 所以写此
  • vant使用时覆盖默认样式

    在我们使用vant的时候 有时候一些组件的默认样式并不能满足我们项目的需求 这个时候我们可以使用下面的办法 覆盖掉默认样式 亲测有效 vant覆盖默认样式的写法 v deep van cell not last child after le
  • transform的scale属性实现对大屏的适配

    最近公司做的大屏用到了transform的scale属性来对大屏网页 进行缩放 缺点 需要给项目大屏 设定固定的宽高 当使用的屏幕分辨率和项目不一致时 会出现左右或者上下的留白 如果设计稿是1920 1080的尺寸 项目中用px来写宽高的话
  • QT 自学内容 day06 文件的打开,读取,写入,输出内容的时候编码方式的修改,文件的创建日期,和最后的修改时间

    1 打开文件 头文件 include
  • 在图像间进行特征匹配

    特征匹配 目标 我们将要学习在图像间进行特征匹配 使用 OpenCV 中的蛮力 Brute Force 匹配和 FLANN 匹配 Brute Force 匹配的基础 蛮力匹配器是很简单的 首先在第一幅图像中选取一个关键点然后依次与第二幅图像
  • python自(2)切片 字典 遍历删除添加修改查询定义函数函数返回值作用域序列化异常报错urllib使用一个类型六个方法下载 视频音频图片

    切片 切片 s hello word 下标索引为0的 print s 0 h 左闭右开 左是下标开始的 右是几个索引值 例如从0开始算 4个索引值 print s 0 4 hell 更改起始值的开始位置 print s 1 ello wor
  • 产品经理的思考-概括

    思考 断断续续从技术转产品已经两年时间 从2021年的按部就班 到2022年的兵荒马乱 从技术到产品会有优势 但也有自身的枷锁 如何发挥优势 跳出枷锁 是一个不断思考和突破的过程 比较转岗会有蜜月期 但是漫长的痛苦才是现实 从技术到产品是需
  • 再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)

    上一篇 Qt实现Rasdial宽带拨号 讲解了下最简单的宽带拨号方式 但是在实际项目开发中 发现 这种做法是不好的 效率低 有时拨号失败 而且上一回 我们是采用异步拨号来实现 这个做法是不行的 我们需要实现同步拨号 那么我们应该借助api函