• 13355阅读
  • 5回复

QT编写获取外网IP和检测是否通外网工具 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2015-04-14
获取本机IP地址,相信初学者人人都会,最简单的方法就是QNetworkInterface::allAddresses()[0].toString(),获取网卡更详细的可以看这里:http://blog.sina.com.cn/s/blog_a6fb6cc90102v0mz.html
如何获取外网IP,一般操作系统不自带这样的命令,需要通过特殊的网页获取,例如ip168,我这里用的是http://whois.pconline.com.cn/,通过打开网页,获取所有源代码,然后分割字符串,取出对应字符串处的本机外网IP地址即可。此方法屡试不爽,什么编程语言都可以采用此方法!

至于检测是否通外网,很多人首先想到的是检测ping命令,然后看结果,这个方法速度比较慢,我想的方法就是直接用tcp连接百度的IP地址的80端口,如果100毫秒之内可以连上说明通外网。
源码下载 IPTool.zip (3 K) 下载次数:422   
百度云下载:http://pan.baidu.com/s/1ntHtxrj
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QtNetwork>
  4. Widget::Widget(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::Widget)
  7. {
  8.     ui->setupUi(this);
  9. }
  10. Widget::~Widget()
  11. {
  12.     delete ui;
  13. }
  14. //判断IP地址及端口是否在线
  15. bool Widget::IPLive(QString ip, int port) {
  16.     QTcpSocket tcpClient;
  17.     tcpClient.abort();
  18.     tcpClient.connectToHost(ip, port);
  19.     //100毫秒没有连接上则判断不在线
  20.     return tcpClient.waitForConnected(100);
  21. }
  22. //获取网页所有源代码
  23. QString Widget::GetHtml(QString url) {
  24.     QNetworkAccessManager *manager = new QNetworkAccessManager();
  25.     QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
  26.     QByteArray responseData;
  27.     QEventLoop eventLoop;
  28.     QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
  29.     eventLoop.exec();
  30.     responseData = reply->readAll();
  31.     return QString(responseData);
  32. }
  33. //获取本机公网IP地址
  34. QString Widget::GetNetIP(QString webCode) {
  35.     QString web = webCode.replace(" ", "");
  36.     web = web.replace("\r", "");
  37.     web = web.replace("\n", "");
  38.     QStringList list = web.split("<br/>");
  39.     QString tar = list[3];
  40.     QStringList ip = tar.split("=");
  41.     return ip[1];
  42. }
  43. void Widget::on_btnGetLocalIP_clicked()
  44. {
  45.     ui->txtLocalIP->setText(QNetworkInterface::allAddresses()[0].toString());
  46. }
  47. void Widget::on_btnGetWebIP_clicked()
  48. {
  49.     ui->txtWebIP->setText(GetNetIP(GetHtml("http://whois.pconline.com.cn/")));
  50. }
  51. void Widget::on_btnCheckWeb_clicked()
  52. {
  53.     //能接通百度IP说明可以通外网
  54.     bool ok=IPLive("202.108.22.5", 80);
  55.     ui->txtCheckWeb->setText(ok?"true":"false");
  56. }


欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线realfan

只看该作者 1楼 发表于: 2015-04-15
赞一下!
很实用的代码
离线alienzj

只看该作者 2楼 发表于: 2015-06-09
好!
离线hanheyfon

只看该作者 3楼 发表于: 2017-04-10
    
离线stlcours

只看该作者 4楼 发表于: 2017-04-10
貌似 bool Widget::IPLive(QString ip, int port) 这种检测方法不是很靠谱。之前我也是用这种方法,后来还是废弃了。有经验的兄弟可以给个说法吗?
离线caroid

只看该作者 5楼 发表于: 2017-05-20
好!
快速回复
限100 字节
 
上一个 下一个