Qt判断下载链接是否可用的方法

SuperHeroMario 2018-10-24 07:05:13
程序里需要从服务器上下载文件,使用的是QNetworkAccessManager的get函数,不过有时候服务器变动,链接就会发生变动,就会导致程序崩溃,所以想在下载之前检查链接是否可用,请问有什么方法可以进行判断吗?或者能够让get函数不崩溃和其他避免程序崩溃的方法也可以,麻烦知道的大佬说一下,谢谢啦。
...全文
606 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperHeroMario 2018-11-14
  • 打赏
  • 举报
回复
引用 2 楼 zzs0829 的回复:
首先,Http请求链接是否有效,也是需要请求过之后才能知道的,相当于,我们用浏览器一样,无效链接会有:404、500等错误反馈。当然,Qt也是对应的判断机制,QNetworkReply::NetworkError这个错误枚举里面都可以包含了(查看帮助文档就知道了)。
QNetworkReply有两个信号:finished和error。finished基本上无论有没有错误都会触发,可以用lastError获取错误信息,error信号只有发生错误才会触发,且在finished信号之前触发。在此之前,都不会导致程序的崩溃,因为Qt已经处理了所有错误情况,所以,程序崩溃的原因很大可能(不排除Qt有BUG,概率很低)是开发的代码的缺陷导致的,我猜测,应该是没有finished的处理没有加入error的判断,导致read数据处理出现崩溃异常(只要发生error,获取的数据肯定是无法正常解析的)。我建议,还是先了解QNetworkAccessManager、QNetworkReply类的用法,再好好设计一下正确的Http请求流程和错误的请求流程。
其次,链接无法直接判断是否有效,但是服务器或者网络是可以判断的(比如:我们会ping一下服务器),QHostInfo::lookupHost可以用于判断服务器是否有效。

用处理error信号的方式似乎不行,因为在执行get函数的时候就卡死了,来不及处理error。现在的处理方法是使用curl命令先获取一下试试。
SuperHeroMario 2018-11-14
  • 打赏
  • 举报
回复
引用 1 楼 qq_41880267 的回复:
崩溃可能是因为查找不到服务器,程序也许执行分析错误,很消耗时间,因此卡在那里了,
之后的程序继续运行有可能导致崩溃。
如何检验链接可用不可用,我不知道
但是你可以使用线程QTread 来执行你的get

get函数下载时找不到链接的文件就会导致程序崩溃,可能是服务器的问题,或者是连接写错了等原因。现在的解决方法是使用curl命令获取一下,能获取到就会继续执行。
弓人水 2018-11-14
  • 打赏
  • 举报
回复
引用 4 楼 xiao969856 的回复:
[quote=引用 2 楼 zzs0829 的回复:]
首先,Http请求链接是否有效,也是需要请求过之后才能知道的,相当于,我们用浏览器一样,无效链接会有:404、500等错误反馈。当然,Qt也是对应的判断机制,QNetworkReply::NetworkError这个错误枚举里面都可以包含了(查看帮助文档就知道了)。
QNetworkReply有两个信号:finished和error。finished基本上无论有没有错误都会触发,可以用lastError获取错误信息,error信号只有发生错误才会触发,且在finished信号之前触发。在此之前,都不会导致程序的崩溃,因为Qt已经处理了所有错误情况,所以,程序崩溃的原因很大可能(不排除Qt有BUG,概率很低)是开发的代码的缺陷导致的,我猜测,应该是没有finished的处理没有加入error的判断,导致read数据处理出现崩溃异常(只要发生error,获取的数据肯定是无法正常解析的)。我建议,还是先了解QNetworkAccessManager、QNetworkReply类的用法,再好好设计一下正确的Http请求流程和错误的请求流程。
其次,链接无法直接判断是否有效,但是服务器或者网络是可以判断的(比如:我们会ping一下服务器),QHostInfo::lookupHost可以用于判断服务器是否有效。

用处理error信号的方式似乎不行,因为在执行get函数的时候就卡死了,来不及处理error。现在的处理方法是使用curl命令先获取一下试试。[/quote]

当然,你的方法也是可以的,如果想从 Qt 层面解决,需要加入超时机制。

QNetworkAccessManager 没有提供网络请求的超时接口,一般超时需要自己用添加(如:QTimer),然后超时的时候执行一下 QNetworkReply 的 abort 接口(这样会收到一个 QNetworkReply::OperationCanceledError )。
弓人水 2018-11-04
  • 打赏
  • 举报
回复
首先,Http请求链接是否有效,也是需要请求过之后才能知道的,相当于,我们用浏览器一样,无效链接会有:404、500等错误反馈。当然,Qt也是对应的判断机制,QNetworkReply::NetworkError这个错误枚举里面都可以包含了(查看帮助文档就知道了)。
QNetworkReply有两个信号:finished和error。finished基本上无论有没有错误都会触发,可以用lastError获取错误信息,error信号只有发生错误才会触发,且在finished信号之前触发。在此之前,都不会导致程序的崩溃,因为Qt已经处理了所有错误情况,所以,程序崩溃的原因很大可能(不排除Qt有BUG,概率很低)是开发的代码的缺陷导致的,我猜测,应该是没有finished的处理没有加入error的判断,导致read数据处理出现崩溃异常(只要发生error,获取的数据肯定是无法正常解析的)。我建议,还是先了解QNetworkAccessManager、QNetworkReply类的用法,再好好设计一下正确的Http请求流程和错误的请求流程。
其次,链接无法直接判断是否有效,但是服务器或者网络是可以判断的(比如:我们会ping一下服务器),QHostInfo::lookupHost可以用于判断服务器是否有效。
qq_41880267 2018-11-02
  • 打赏
  • 举报
回复
崩溃可能是因为查找不到服务器,程序也许执行分析错误,很消耗时间,因此卡在那里了, 之后的程序继续运行有可能导致崩溃。 如何检验链接可用不可用,我不知道 但是你可以使用线程QTread 来执行你的get

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧