查看完整版本: [-- QT编写获取外网IP和检测是否通外网工具 --]

QTCN开发网 -> Qt 作品展 -> QT编写获取外网IP和检测是否通外网工具 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liudianwu 2015-04-14 10:33

QT编写获取外网IP和检测是否通外网工具

获取本机IP地址,相信初学者人人都会,最简单的方法就是QNetworkInterface::allAddresses()[0].toString(),获取网卡更详细的可以看这里:http://blog.sina.com.cn/s/blog_a6fb6cc90102v0mz.html
如何获取外网IP,一般操作系统不自带这样的命令,需要通过特殊的网页获取,例如ip168,我这里用的是http://whois.pconline.com.cn/,通过打开网页,获取所有源代码,然后分割字符串,取出对应字符串处的本机外网IP地址即可。此方法屡试不爽,什么编程语言都可以采用此方法!
[attachment=13566]
至于检测是否通外网,很多人首先想到的是检测ping命令,然后看结果,这个方法速度比较慢,我想的方法就是直接用tcp连接百度的IP地址的80端口,如果100毫秒之内可以连上说明通外网。
源码下载:[attachment=13567]  
百度云下载:http://pan.baidu.com/s/1ntHtxrj
  1. #include "widget.h"
    #include "ui_widget.h"
    #include <QtNetwork>

    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }

    Widget::~Widget()
    {
        delete ui;
    }

    //判断IP地址及端口是否在线
    bool Widget::IPLive(QString ip, int port) {
        QTcpSocket tcpClient;
        tcpClient.abort();
        tcpClient.connectToHost(ip, port);
        //100毫秒没有连接上则判断不在线
        return tcpClient.waitForConnected(100);
    }

    //获取网页所有源代码
    QString Widget::GetHtml(QString url) {
        QNetworkAccessManager *manager = new QNetworkAccessManager();
        QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
        QByteArray responseData;
        QEventLoop eventLoop;
        QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
        eventLoop.exec();
        responseData = reply->readAll();
        return QString(responseData);
    }

    //获取本机公网IP地址
    QString Widget::GetNetIP(QString webCode) {
        QString web = webCode.replace(" ", "");
        web = web.replace("\r", "");
        web = web.replace("\n", "");
        QStringList list = web.split("<br/>");
        QString tar = list[3];
        QStringList ip = tar.split("=");
        return ip[1];
    }

    void Widget::on_btnGetLocalIP_clicked()
    {
        ui->txtLocalIP->setText(QNetworkInterface::allAddresses()[0].toString());
    }

    void Widget::on_btnGetWebIP_clicked()
    {
        ui->txtWebIP->setText(GetNetIP(GetHtml("http://whois.pconline.com.cn/")));
    }

    void Widget::on_btnCheckWeb_clicked()
    {
        //能接通百度IP说明可以通外网
        bool ok=IPLive("202.108.22.5", 80);
        ui->txtCheckWeb->setText(ok?"true":"false");
    }



realfan 2015-04-15 08:21
赞一下!
很实用的代码

alienzj 2015-06-09 18:35
好!

hanheyfon 2017-04-10 12:05
    

stlcours 2017-04-10 19:05
貌似 bool Widget::IPLive(QString ip, int port) 这种检测方法不是很靠谱。之前我也是用这种方法,后来还是废弃了。有经验的兄弟可以给个说法吗?

caroid 2017-05-20 21:20
好!


查看完整版本: [-- QT编写获取外网IP和检测是否通外网工具 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled