精华内容
下载资源
问答
  • 资源代码主要是对QT网络编程中主机信息查询的使用,具体介绍看博主文章《QT中QHostInfo和QNetworkInterface的使用》
  • Qt QHostInfo详解

    2021-03-17 21:32:37
    1.QHostInfo 主要用来查询主机信息,包括主机名,ip地址,DNS域名等信息。 以下常用静态方法 QHostInfo::localHostName():获取本机的主机名。 QHostInfo::fromName(QString &name):通过主机名获取IP地址。...

    1.QHostInfo

    主要用来查询主机信息,包括主机名,ip地址,DNS域名等信息。

    以下常用静态方法

    • QHostInfo::localHostName():获取本机的主机名。
    • QHostInfo::fromName(QString &name):通过主机名获取IP地址。
    • QHostInfo::lookupHost():可以通过一个主机名,以异步方式查找这个主机的IP地址。
    • QHostInfo::localDomainName():返回本机DNS域名。

    以下常用方法

    • QString hostName():返回通过IP查找的主机的名称。
    • int lookupId():返回本次查找的ID
    • QString errorString():返回主机查找失败,返回错误描述的字符串。

    2.示例

    获取本机的主机信息和获取百度域名信息

    //.h
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QHostInfo>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
        QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol);
    
    private slots:
        void on_btnGetHostInfo_clicked();
    
        void on_btnGetIp_clicked();
    
        void on_btnClear_clicked();
    
        void on_lookUpHostInfo(const QHostInfo&);
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    //.cpp
    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    QString Widget::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
    {
        switch (protocol) {
        case QAbstractSocket::IPv4Protocol:
            return "IPv4 Protocol";
        case QAbstractSocket::IPv6Protocol:
            return "IPv6 Protocol";
        case QAbstractSocket::AnyIPProtocol:
            return "Any IP Protocol";
        default:
            return "Unknown Network Layer Protocol";
        }
    }
    
    void Widget::on_btnGetHostInfo_clicked()
    {
        //本地主机名
        QString hostName = QHostInfo::localHostName();
        ui->plainTextEdit->appendPlainText("本地主机名: "+ hostName + "\n");
    
        //本机IP地址
        QHostInfo hostInfo = QHostInfo::fromName(hostName);
    
        //IP地址列表
        QList<QHostAddress> addrList = hostInfo.addresses();
        for(int i=0;i<addrList.count();i++)
        {
            QHostAddress host = addrList.at(i);
    
            bool isShow = ui->checkBox->isChecked();
            if(isShow)
                isShow = (QAbstractSocket::IPv4Protocol == host.protocol()); //IPv4协议
            else
                isShow = true;
            if(isShow)
            {
                ui->plainTextEdit->appendPlainText("协议: "+protocolName(host.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址: "+host.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
    }
    
    void Widget::on_btnGetIp_clicked()
    {
        //主机名
        QString hostName = ui->lineEdit->text();
    
        ui->plainTextEdit->appendPlainText("正在查询主机信息: "+ hostName);
        QHostInfo::lookupHost(hostName,this,SLOT(on_lookUpHostInfo(QHostInfo)));
    }
    
    void Widget::on_btnClear_clicked()
    {
        ui->plainTextEdit->clear();
    }
    
    void Widget::on_lookUpHostInfo(const QHostInfo &host)
    {
        //IP地址列表
        QList<QHostAddress> addrList = host.addresses();
        for(int i=0;i<addrList.count();i++)
        {
            QHostAddress host = addrList.at(i);
    
            bool isShow = ui->checkBox->isChecked();
            if(isShow)
                isShow = (QAbstractSocket::IPv4Protocol == host.protocol()); //IPv4协议
            else
                isShow = true;
            if(isShow)
            {
                ui->plainTextEdit->appendPlainText("协议: "+protocolName(host.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址: "+host.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
    }
    

     

    展开全文
  • 简 述: 了解主机信息查询QHostInfo和QNetworkInterface查询IP等函数接口的使用,书写一个简单地例子;然后写了一个小的 Qt例子,用来实现和验证它的空间的一些属性和功能的用法。 文章目录系统环境:网络相关知识...

    简 述: 了解主机信息查询QHostInfoQNetworkInterface查询IP等函数接口的使用,书写一个简单地例子;然后写了一个小的 Qt例子,用来实现和验证它的空间的一些属性和功能的用法。



    系统环境:

    编程环境: MacOS 10.14.6 (18G103) 编程软件: Qt 5.9.8Qt Creator 4.8.2


    网络相关知识:

    终于讲解到了我之前就心心恋恋的网络模块的知识了,有几个点一直是很想涉及的知识模块👏👏👏;一个是网络,另外一个就是多线程的相关知识;柑橘🍊现在很多电脑💻的应用程序都会使用到这两个部分的知识模块,再➕一个数据库📚就是==App? 成为一个独立的开发者,可以写一个自己喜欢的exe或者app,慢慢打磨;人生易短,做自己喜欢的事情,💰不¥$$💰的都是无所谓的。谁都有离开的一天,die是不可避免的,可我们如何证明自己来这这里玩过几十载呢?总的留下一些什么的痕迹吧~

    或许朝闻道,夕死可矣~ ???

    来自一个12-25🎄🎄🎄🎄:夜间没人约会的+上班的孤独狗 ➜ 🐶👨 的一篇博客📝

    有点跑偏了:

    网络模块的相关知识,主要就是七层协议原理 和它们衍生出来的网络协议,有N多种,其中经过时间的检验和筛选,现在常用的就是TCP/IP协议族,展开就是TCP,UDP,HTTP,HTTPS,ftp,socket等等

    网络相关:

    建议开始之前,先问问自己如下问题,自己能够区分概念是什么,自己懂了吗❓❓❓

    • mac地址
    • IP地址
    • port端口
    • 主机名
    • 子网掩码,A/B/C/D四类地址
    • 数据包? 报文?自定义协议?
    • 通信协议有哪些?
    • 三次握手🤝,四次挥手👋?
    • TCP/UDP/Http区别
    • 数据包经过路由器如何转到下一台设备?
    • 一款程序是怎么在局域网之间通信的?
    • 一款程序是怎么在互联网之间通信的?

    关于网络更底层的协议和实现的原理的相关学习知识,可以多看看👀下面这两个视频链接,我就是之前学习的此mooc网络课,觉得讲解的很棒,故此口口相传的推荐出来:


    QHostInfo属性:

    得益于Qt强大的封装库,上面的很多细节都不用深究,只需要创建一两个对象,然后调用他们的函数,就可以获得他们的网络相关的信息;

    QHostInfo类可以通过静态函数localHostName()获取 本机的主机名 再通过fromName()函数可以获取到 IP地址,而lookupHost()则是通过异步方式查询到这个主机的IP地址。

    类别函数原型作用
    公共函数QList addresses()返回与hostName()关联的IP地址列表
    公共函数HostInfoError error()如果主机查找失败,返回失败类型
    公共函数QString errorString()如果主机查找失败,返回错误描述字符串
    公共函数QString hostName()返回通过IP查找的主机名称
    公共函数int lookupld()返回本次查找的id
    静态函数void abortHostLookup(int id)中断主机查找
    静态函数QHostInfo fromName(QString &name)返回指定主机名IP的地址
    静态函数QString localDomainName()返回本机DNS域名
    静态函数QString localHostName()返回本机主机名
    静态函数int lookupHost(QString byname, QObject *receiver, char *member)以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于abortHostLookup()
    //QHostInfo 获取主机信息
        QString hostName = QHostInfo::localHostName();
        ui->plainTextEdit->appendPlainText("本地主机名称:" + hostName + "\n");
    
        QHostInfo hostInfo = QHostInfo::fromName(hostName);
        QList<QHostAddress> list = hostInfo.addresses();
    
        if (list.isEmpty())
            return;
    
        foreach (QHostAddress var, list) {
            bool bIPv4 = ui->checkBox->isChecked();
    
            if (bIPv4) {   //只显示 IPv4
                bIPv4 = QAbstractSocket::IPv4Protocol == var.protocol();
            } else {
                bIPv4 = true;   //显示 IPv4 和 IPv6
            }
    
            if (bIPv4) {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(var.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址" + var.toString() + "\n");
            }
        }
    

    QNetworkInterface属性:

    QNetworkInterface类是可以获得应用程序的主机的所有IP地址和网络地址接口的列表。静态函数allInterfaces()返回主机上所有网络接口的列表,一个网络接口可能包含多个IP地址,每个IP地址与地址掩码或广播地址的关联;当然也有一个简版的获取函数allAddresses()可以获取到,但是不会返回子网掩码和广播的IP地址。

    类别函数原型作用
    公共函数QList addressEntries()返回该网络接口(包含子网掩码+广播地址)的IP地址列表
    公共函数QString hardwareAddress()返回该接口的低级硬件地址,以太网里就是MAC地址
    公共函数QString humanReadableName()返回可以读懂的接口名称没如果名称不确定,得到的就是name()的返回值
    公共函数bool isValid()如果接口信息有效就返回true
    公共函数QString name()返回主机上所有IP地址的列表
    静态函数QList allAddresses()返回主机上面的所有IP地址的列表
    静态函数QList allInterfaces()返回主机上面的所有接口的网络列表

    QAbstractSocket属性:

    QAbstractSocket::NetworkLayerProtocol 枚举:

    该枚举描述了Qt中使用的网络层协议值。

    ConstantValueDescription
    QAbstractSocket::IPv4Protocol0IPv4
    QAbstractSocket::IPv6Protocol1IPv6
    QAbstractSocket::AnyIPProtocol2Either IPv4 or IPv6
    QAbstractSocket::UnknownNetworkLayerProtocol-1Other than IPv4 and IPv6

    运行效果:

    这里上一张运行效果图:


    源码分析:

    其中核心部分的源码,重点和一些难点以及需要注意的一些地方,贴出来如下

    其中.h头文件如下:

    #ifndef EXQHOSTINFO_H
    #define EXQHOSTINFO_H
    
    #include <QWidget>
    #include <QAbstractSocket>
    class QHostInfo;
    
    
    namespace Ui {
    class ExQHostInfo;
    }
    
    class ExQHostInfo : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit ExQHostInfo(QWidget *parent = nullptr);
        ~ExQHostInfo();
    
    private:
        QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol);  //通过协议类型返回协议名称
    
    private slots:
        void on_btnGetHostInfo_clicked();    //QHostInfo查询主机名和IP
        void on_btnAllAddresses_clicked();   //QNetworkInterface::allAddresses()
        void on_btnAllInterfaces_clicked();  //QNetworkInterface::allInterfaces()
        void on_btnFindIP_clicked();         //QHostInfo查询左侧域名IP地址
        void on_btnClean_clicked();          //清空文本框信息
    
        void onLookedUpHostInfo(const QHostInfo& host);  //查询主机信息的槽函数
    
    private:
        Ui::ExQHostInfo *ui;
    
    };
    
    #endif // EXQHOSTINFO_H
    

    其中.cpp源文件如下:

    #include "ExQHostInfo.h"
    #include "ui_ExQHostInfo.h"
    
    #include <QHostInfo>
    #include <QNetworkInterface>
    
    ExQHostInfo::ExQHostInfo(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ExQHostInfo)
    {
        ui->setupUi(this);
    
        setWindowTitle("QHostInfo/QNetworkInterface查询主机网络状态:");
    }
    
    ExQHostInfo::~ExQHostInfo()
    {
        delete ui;
    }
    
    //通过协议类型返回协议名称
    QString ExQHostInfo::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
    {
        switch (protocol) {
        case QAbstractSocket::IPv4Protocol:
            return "IPv4 Protocol";
        case QAbstractSocket::IPv6Protocol:
            return "IPv6 Protocol";
        case QAbstractSocket::AnyIPProtocol:
            return "Any IP Protocol";
        default:
            return "Unknow Network Layer Protocol";
        }
    }
    
    //QHostInfo 获取主机信息
    void ExQHostInfo::on_btnGetHostInfo_clicked()
    {
        QString hostName = QHostInfo::localHostName();
        ui->plainTextEdit->appendPlainText("本地主机名称:" + hostName + "\n");
    
        QHostInfo hostInfo = QHostInfo::fromName(hostName);
        QList<QHostAddress> list = hostInfo.addresses();
    
        if (list.isEmpty())
            return;
    
        foreach (QHostAddress var, list) {
            bool bIPv4 = ui->checkBox->isChecked();
    
            if (bIPv4) {   //只显示 IPv4
                bIPv4 = QAbstractSocket::IPv4Protocol == var.protocol();
            } else {
                bIPv4 = true;   //显示 IPv4 和 IPv6
            }
    
            if (bIPv4) {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(var.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址" + var.toString() + "\n");
            }
        }
    }
    
    void ExQHostInfo::on_btnAllAddresses_clicked()
    {
        QList<QHostAddress> list = QNetworkInterface::allAddresses();
    
        if (list.isEmpty())
            return;
    
        foreach (QHostAddress var, list) {
            bool bIPv4 = ui->checkBox->isChecked();
    
            if (bIPv4) {   //只显示 IPv4
                bIPv4 = QAbstractSocket::IPv4Protocol == var.protocol();
            } else {
                bIPv4 = true;   //显示 IPv4 和 IPv6
            }
    
            if (bIPv4) {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(var.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址" + var.toString() + "\n");
            }
        }
    }
    
    void ExQHostInfo::on_btnAllInterfaces_clicked()
    {
        QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    
        if (list.isEmpty())
            return;
    
        foreach (QNetworkInterface var, list) {
            if (!var.isValid())
                continue;
    
            ui->plainTextEdit->appendPlainText("设备名称:" + var.humanReadableName());
            ui->plainTextEdit->appendPlainText("硬件地址:" + var.hardwareAddress());
    
            QList<QNetworkAddressEntry> entry = var.addressEntries();
            foreach (QNetworkAddressEntry ent, entry) {
                ui->plainTextEdit->appendPlainText("  IP 地址:" + ent.ip().toString());
                ui->plainTextEdit->appendPlainText("  子网掩码:" + ent.netmask().toString());
                ui->plainTextEdit->appendPlainText("  子网广播:" + ent.broadcast().toString() + "\n");
            }
        }
    }
    
    void ExQHostInfo::on_btnFindIP_clicked()
    {
        QString hostName = ui->lineEdit->text();  //域名
        ui->plainTextEdit->appendPlainText("正在查找域名的服务器的主机信息:" + hostName);
        QHostInfo::lookupHost(hostName, this, SLOT(onLookedUpHostInfo(QHostInfo)));
    }
    
    void ExQHostInfo::on_btnClean_clicked()
    {
        ui->plainTextEdit->clear();
    }
    
    //查询主机信息的槽函数
    void ExQHostInfo::onLookedUpHostInfo(const QHostInfo &host)
    {
        QList<QHostAddress> list = host.addresses();
    
        if (list.isEmpty())
            return;
    
        for (int i = 0; i < list.count(); i++) {
            QHostAddress host = list.at(i);
            bool bIpv4 = ui->checkBox->isChecked();  //只显示IPv4
    
            if (bIpv4) {   //只显示 IPv4
                bIpv4 = QAbstractSocket::IPv4Protocol == host.protocol();
            } else {
                bIpv4 = true;   //显示 IPv4 和 IPv6
            }
    
            if (bIpv4) {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(host.protocol()));
                ui->plainTextEdit->appendPlainText(host.toString());
            }
        }
    }
    
    

    源码下载:

    https://github.com/xmuli/QtExamples【QtQHostInfoEx】

    展开全文
  • QHostInfo检测网络

    2019-10-03 13:40:31
    平时,我们检测网络是否连接,一般都是用ping命令。...QHostInfo给我们提供了一个方便的接口,实现这一的功能。话不多说,先上一段代码demo NetWorkTest *NetWorkTest::GetInstance() { static NetWorkTest ins...

       平时,我们检测网络是否连接,一般都是用ping命令。实际开发中,经常也需要检测网络状态。最近之项目过程中就需要实现这一的功能,在网络断开时给出相应的用户提示。QHostInfo给我们提供了一个方便的接口,实现这一的功能。话不多说,先上一段代码demo

    
    NetWorkTest *NetWorkTest::GetInstance()
    {
        static NetWorkTest instance;
        return &instance;
    }
    
    void NetWorkTest::checkNetWork()
    {
        QHostInfo::lookupHost("www.baidu.com",this,SLOT(lookedUpSlot(QHostInfo)));
        qDebug()<< "lookupHost";
    }
    
    NetWorkTest::NetWorkTest(QObject *parent) : QObject(parent)
    {
    
    }
    
    
    void NetWorkTest::lookedUpSlot(QHostInfo hostInfo)
    {
        qDebug()<<__FUNCTION__;
        bool status = false;
        if(hostInfo.error() == QHostInfo::NoError)
        {
            status = true;
        }
        emit netWorkStateChanged(status);
    }
    
    
    //main.cpp
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
    
    
        QQmlContext *context=engine.rootContext();
        context->setContextProperty("netWorkTest", NetWorkTest::GetInstance());
        engine.load(url);
    
        return app.exec();
    }
    
    //main.qml
    Window {
        visible: true
        width: 640
        height: 480
    //    title: qsTr("Hello World")
        property bool connected: true//qsTr("网络已连接")
        RowLayout {
            id: layout
    //        anchors.fill: parent
            width: 200
            anchors.centerIn: parent
            Button{
                text: qsTr("检测网络")
                onClicked: {
                    netWorkTest.checkNetWork();
                }
            }
            Label{
                text: qsTr("网络状态:")
            }
            Label{
                id: status
                text: {
                    if(connected)
                    {
                        return qsTr("网络已连接")
                    }
                    else{
                        return qsTr("网络已断开")
                    }
                }
            }
        }
        Connections{
            target: netWorkTest
            onNetWorkStateChanged:{
                console.log('isConnected: ',isConnected)
                connected = isConnected;
            }
        }
    
    }
    
    

    这样,基本实现我们需要的结果。但是,实际测试过程中发现,断开网络之后,再检测,还是返回true。着就让人纳闷。更郁闷的是,从QHostInfo的说明文档找不到任何相关的说明。个人猜测就是有缓存。要找到真正的原因,只能看QHostInfo的实现代码了。

    
    int QHostInfo::lookupHost(const QString &name, QObject *receiver,
                              const char *member)
    {
       //此处省略不重要的代码
        //以下才是我们要关注的核心代码
        QHostInfoLookupManager *manager = theHostInfoLookupManager();
    
        if (manager) {
            // the application is still alive
            if (manager->cache.isEnabled()) {
                // check cache first
                bool valid = false;
                QHostInfo info = manager->cache.get(name, &valid);
                if (valid) {
                    if (!receiver)
                        return -1;
    
                    info.setLookupId(id);
                    QHostInfoResult result;
                    QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
                    result.emitResultsReady(info);
                    return id;
                }
            }
    
            // cache is not enabled or it was not in the cache, do normal lookup
            QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id);
            if (receiver)
                QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection);
            manager->scheduleLookup(runnable);
        }
        return id;
    }
    

    如此,我们清楚QHostInfo确实三用了缓存。既然三缓存,我们有没有办法清除这些缓存呢。继续深入探讨源码:

    // cache for 60 seconds
    // cache 128 items
    QHostInfoCache::QHostInfoCache() : max_age(60), enabled(true), cache(128)
    {
    #ifdef QT_QHOSTINFO_CACHE_DISABLED_BY_DEFAULT
        enabled = false;
    #endif
    }
    
    bool QHostInfoCache::isEnabled()
    {
        return enabled;
    }
    
    // this function is currently only used for the auto tests
    // and not usable by public API
    void QHostInfoCache::setEnabled(bool e)
    {
        enabled = e;
    }
    

    看看这实现,显然是没办法了。没有对外的API可以清除缓存或者修改缓存过期时间。既然如此,想要解决这个问题,就只能自己实现ping操作了。

    void pingHost(NetWorkTest* instance)
    {
        QProcess exc;
        QTextCodec *codec = QTextCodec::codecForName("GBK");
        QString cmdstr="ping www.baidu.com";
        exc.start(cmdstr);
        exc.waitForFinished(-1);
        QString  outstr=codec->toUnicode(exc.readAll());
        qDebug()<<outstr;
        bool status = false;
        if((-1 !=outstr.indexOf("往返行程的估计时间")))
        {
          qDebug("在线\n");
          status = true;
        }
        emit instance->netWorkStateChanged(status);
    }
    
    void NetWorkTest::checkNetWork()
    {
    
       QFuture<void> future = QtConcurrent::run(pingHost,this);
    }

    这里用到了QtConcurrent实现多线程,防止卡住界面。

    https://github.com/huanghaining/NetWork

    展开全文
  • Qt:QHostInfo

    2020-12-10 10:30:03
    QHostInfo类为主机名查找提供静态功能。此类中的所有函数都是reentent。 Header: #include qmake: QT += network QHostInfo查找与主机名相关联的IP地址,或者与IP地址关联的主机名。该类提供了两个静态...

    理论

    QHostInfo类为主机名查找提供静态功能。此类中的所有函数都是reentent。

    Header:#include
    qmake:QT += network

    QHostInfo查找与主机名相关联的IP地址,或者与IP地址关联的主机名。该类提供了两个静态便利函数:

    • 一个异步工作并在找到主机后发出信号的函数,
    • 另一个则阻塞并返回QHostInfo对象的函数

    要异步查找主机的IP地址,请调用lookupHost(),它将主机名或IP地址,接收方对象和插槽签名作为参数并返回ID。您可以通过使用查找ID调用abortHostLookup()来中止查找。例子:

    // To find the IP address of qt-project.org
    QHostInfo::lookupHost("qt-project.org",
                          this, SLOT(printResults(QHostInfo)));
    
    // To find the host name for 4.2.2.1
    QHostInfo::lookupHost("4.2.2.1",
                          this, SLOT(printResults(QHostInfo)));
    

    结果准备好后,将调用该插槽。结果存储在QHostInfo对象中。调用addresses()以获得主机的IP地址列表,并调用hostName()以获得所查找的主机名。

    如果查找失败,则error()返回发生的错误的类型,errorString()提供了人类可读的查找错误描述。

    如果要阻止查找,请使用QHostInfo :: fromName()函数:

    QHostInfo info = QHostInfo :: fromName( “ qt-project.org”); 
    

    QHostInfo通过IDNA和Punycode标准支持国际化域名(IDN)。

    要检索本地主机的名称,请使用静态QHostInfo :: localHostName()函数

    QHostInfo使用操作系统提供的机制来执行查找。根据{https://tools.ietf.org/html/rfc6724}{RFC 6724},不能保证将返回为域或主机注册的所有IP地址。

    注意:从Qt 4.6.1开始,QHostInfo使用多个线程进行DNS查找,而不是使用一个专用DNS线程。与早期版本的Qt相比,这不仅提高了性能,而且还改变了使用lookupHost()时的信号发射顺序。

    注意:由于Qt 4.6.3,QHostInfo使用内部60秒小的DNS缓存来提高性能。

    QHostInfo :: HostInfoError

    原型

    enum QHostInfo::HostInfoError
    

    作用

    • 该枚举描述了尝试解析主机名时可能发生的各种错误。
    • 另请参见error()setError()。
    Constantvalue描述
    QHostInfo::NoError0查找成功。
    QHostInfo::HostNotFound1找不到主机的IP地址。
    QHostInfo::UnknownError2出现未知错误。

    QHostInfo

    原型

    // Move从other构造一个新的QHostInfo 
    QHostInfo::QHostInfo(QHostInfo &&other)  
    // 构造other的副本
    QHostInfo::QHostInfo(const QHostInfo &other)
    // 构造一个空的主机信息对象,其查找ID为id。另请参见lookupId()。
    QHostInfo :: QHostInfo(int id = -1

    作用

    • 构造主机信息对象。

    abortHostLookup

    原型

    [static]
         void QHostInfo::abortHostLookup(int id)
    

    作用

    • 中止使用ID的主机查找,该ID由lookupHost()返回。
    • 另请参见lookupHost()lookupId()。

    addresses

    原型

    QList<QHostAddress> QHostInfo::addresses() const
    

    作用

    • 返回与hostName()关联的IP地址列表。此列表可能为空。
    • 另请参见setAddresses(), hostName(), error().
    QHostInfo info;
    ...
    if (!info.addresses().isEmpty()) {
        QHostAddress address = info.addresses().first();
        // use the first IP address
    }
    

    error

    原型

    QHostInfo :: HostInfoError QHostInfo :: error()const
    

    作用

    • 返回在主机名查找失败时发生的错误的类型;否则返回NoError。
    • 另请参见setError()errorString()

    errorString

    原型

    QString QHostInfo::errorString() const
    

    作用

    • 如果查找失败,则此函数返回错误的可读描述;否则,错误返回。否则返回“未知错误”。
    • 另请参见setError()error()

    fromName

    原型

    [static]QHostInfo QHostInfo::fromName(const QString &name)
    

    作用

    • 查找给定主机名的IP地址。函数在查找过程中阻塞,这意味着程序的执行被暂停,直到查找的结果准备好为止。返回QHostInfo对象中的查找结果。
      如果您将一个字面IP地址传递给name而不是主机名,QHostInfo将搜索IP的域名(也就是,QHostInfo将执行反向查找)。如果成功,返回的QHostInfo将包含解析的域名和主机名的IP地址。
    • 另请参见lookupHost()

    hostName

    原型

    QString QHostInfo :: hostName()const
    

    作用

    • 返回查找其IP地址的主机的名称。
    • 另请参见setHostName()和localHostName()。

    localDomainName

    原型

    [static]QString QHostInfo :: localDomainName()
    

    作用

    • 返回此计算机的DNS域。
    • 注意: DNS域与Windows网络中发现的域名无关。
      另请参见hostName()

    localHostName

    原型

    [static]QString QHostInfo :: localHostName()
    

    作用

    • 如果已配置,则返回本机的主机名。请注意,不能保证主机名是全局唯一的,特别是如果它们是自动配置的。
    • 此函数不能保证返回的主机名是完全合格的域名(FQDN)。为此,请使用fromName()将返回的名称解析为FQDN。
    • 此函数返回与QSysInfo :: machineHostName()相同的函数。
    • 另请参见hostName()localDomainName()。

    lookupHost

    原型

    [static]int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)
    

    作用

    • 查找与主机名name相关联的IP地址,并返回一个用于查找的ID。当查找的结果准备好时,将使用QHostInfo参数调用receiver中的slot或信号成员。然后可以检查QHostInfo对象以获得查找的结果。

    查找由单个函数调用执行,例如:

    QHostInfo::lookupHost("www.kde.org",
                          this, SLOT(lookedUp(QHostInfo)));
    

    插槽的实现打印查找返回的地址的基本信息,或者在查找失败时报告一个错误:

    void MyWidget::lookedUp(const QHostInfo &host)
    {
        if (host.error() != QHostInfo::NoError) {
            qDebug() << "Lookup failed:" << host.errorString();
            return;
        }
    
        const auto addresses = host.addresses();
        for (const QHostAddress &address : addresses)
            qDebug() << "Found address:" << address.toString();
    }
    

    如果您将一个字面IP地址传递给name而不是主机名,QHostInfo将搜索IP的域名(也就是,QHostInfo将执行反向查找)。如果成功,结果QHostInfo将包含解析的域名和主机名的IP地址。例子:

    QHostInfo::lookupHost("4.2.2.1",
                          this, SLOT(lookedUp(QHostInfo)));
    

    注意:如果使用lookupHost()启动多个请求,并不能保证发出信号的顺序。

    展开全文
  • Qt 之 QHostInfo

    万次阅读 2016-03-01 18:48:38
    简述QHostInfo 类为主机名查找提供了静态函数。QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址,或者与一个IP地址相关联的主机名。这个类提供了两个静态的便利函数:一个以异步方式...
  • QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址 头文件:#include<QHostInfo> //获取本机的名称 QString loaclHostName = QHostInfo::localHostName(); qDebug()<<"本...
  • 【Qt】QHostInfo之lookupHost函数

    千次阅读 2020-05-20 14:44:16
    本函数用来在网络上查找主机,可以根据主机名称查找,也可以根据IP地址查找。有一个重载格式为: [static] int QHostInfo::...QHostInfo::lookupHost("JHCW", this, lookup(const QHostInfo&)); 其中第一个参数为
  • QHostInfo、QNetworkInformation的使用程序效果展示 程序 需要先加入网络模块:在.pro中加入QT+=network .h #ifndef NETWORKINFORMATION_H #define NETWORKINFORMATION_H #include <QWidget> #include <...
  • 1、QHostInfo: 利用操作系统所提供的查询机制来查询与特定主机名相关联的主机的IP地址,或者与一个IP地址相关联的主机名。 QHostInfo info = QHostInfo::fromName("www.baidu.com"); qDebug() << info....
  • QHostInfo中有一个查找机制,可以根据IP找主机名,也可能工具主机名找IP,可以通过调用QHostInfo::lookupHost这个静态函数进行操作,这里要注意这里是异步发送的,后面将会稍微说明下! 如下例子: // To find ...
  • Qt之QHostInfo

    2016-03-01 18:48:00
    QHostInfo 类为主机名查找提供了静态函数。 QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址,或者与一个IP地址相关联的主机名。这个类提供了两个静态的便利函数:一个以异步方式...
  • 文章目录 异常描述 异常原因 解决方法 开发环境 ...在读取主机名称时,需要用到: ...QHostInfo::localHostName();...后发现是因为QHostInfo是属于" QtNetwork "下的,需要完整引用; 解决方法 引用如下即可:
  • QT的QHostInfo类的使用

    2020-12-13 13:35:37
    QHostInfo类为主机名查找提供静态功能。 QHostInfo使用操作系统提供的查找机制来查找与主机名关联的IP地址或与IP地址关联的主机名。该类提供了两个静态便利函数:一个异步工作并在找到主机后发出信号,另一个则阻塞...
  • 【VS+QT开发】找不到到qhostinfo.h文件

    千次阅读 2018-09-28 17:00:11
    简述 网络上的其他遇到的都是在Qt creator上开发的...QtNetwork\qhostinfo.h&gt; 在下面的文章中得到启发(虽然他也是在qt creator上写的,但是我发现在network内有这个东西,所以试着使用下,结果就过了) ht...
  • Qt中提供了几个用于获取主机网络信息的类,包括:QHostInfo、QHostAddress、QNetworkInterface以及QNetworkAddress。 QHostInfo类提供了一系列用于主机名查询的静态函数。 QHostInfo利用操作系统提供的查询机制来...
  • Qt网络编程-主机信息查询QHostInfo类1.主要功能函数介绍2.QHostInfo的使用 前言:  查询一个主机的MAC地址或IP地址是网络应用程序中经常用到的功能,Qt提供了QHostInfo类和QNetworkInterface类 可以用于此类信息的...
  • 1、QHostInfo类: (1)基本使用: 在.pro中添加代码: QT += network 在mainwindow.h中引入QHostInfo: #include 在mainwindow.cpp中: QString hostName = QHostInfo::localHostName(); //本机主机名 QHostInfo ...
  • QHostInfo 查找与主机名关联的 IP 地址,或与 IP 地址关联的主机名。 二、类型成员 1、QHostInfo::HostInfoError:此枚举描述了尝试解析主机名时可能发生的各种错误。 NoError:无错误。 HostNotFound:找不到...
  • QHostInfo头文件找不到

    千次阅读 2015-03-31 14:03:16
    需要在.pro文件 中添加 QT += core gui network
  • QHostInfo

    千次阅读 2013-12-31 17:06:24
    QHostinfo提供了静态函数用来主机名的查找  QHostinfo使用操作系统提供的查找机制寻找与主机相关联的IP地址的名字,或者与主机名相关联的IP地址。这个类提供两个静态方便的函数:一个异步工作当主机被找到发射信号...
  • 1. 将主机名解析为IP地址 QHostInfo 用于主机名的查找
  • 1.使用QHostInfo获取主机名和IP地址。 (1)获取主机名。  1. QString localHostName = QHostInfo::localHostName();  2. qDebug() (2)获取本机的IP地址。
  • 一、QHostInfo、QNetworkInterface类 功能:QT提供了这两个类用于查询一个主机的MAC地址或IP地址 头文件: #include <QHostInfo> #include <QNetworkInterface> #include <QNetworkAddressEntry...
  • QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo))); } void Dialog::on_btnClear_clicked() { ui->plainTextEdit->clear(); } QString Dialog::protocolName(QAbstractSocket::...
  • QHostInfo类 lookupHost(),以异步的方式查找主机的IP地址 主要函数: QHostAddress类提供一个IP地址的信息,包括Ipv4,Ipv6。QHostAddress有两个主要函数: protocol() : 返回QAbstractSocket::...
  • 重点知识已近在代码里注释... 请仔细看代码 本文原创 转载请保留此链接 ... #include &...QHostInfo&gt; #include &lt;QNetworkInterface&gt; #include &lt;QMessageBox&gt; #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 903
精华内容 361
关键字:

qhostinfo