zoukankan      html  css  js  c++  java
  • Qt之QHostInfo

    简述

    QHostInfo 类为主机名查找提供了静态函数。

    QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址,或者与一个IP地址相关联的主机名。这个类提供了两个静态的便利函数:一个以异步方式工作,一旦找到主机就发射一个信号;另一个以阻塞方式工作,并且最终返回一个 QHostInfo 对象。

    要使用异步方式查询主机的 IP 地址,调用 lookupHost() 即可,该函数包含 3 个参数,依次是:主机名/ IP 地址、接收的对象、接收的槽函数,并返回一个查询ID。以查询ID为参数,通过调用 abortHostLookup() 函数的来中止查询。

    当获得查询结果后就会调用槽函数,查询结果被存储到 QHostInfo 对象中。可通过调用 addresses() 函数来获得主机的 IP 地址列表,同时可通过调用 hostName() 函数来获得查询的主机名。

    查询本机主机名

    QString strLocalHostName = QHostInfo::localHostName();
    qDebug() << "Local Host Name:" << strLocalHostName;

    输出结果:

    Local Host Name:”Wang-PC”

    查询主机信息

    异步方式

    使用 lookupHost() ,实际的查询在一个单独的线程中完成,利用操作系统的方法来执行名称查找。

    • 根据主机名查询主机信息
    int nID = QHostInfo::lookupHost("qt-project.org", this, SLOT(lookedUp(QHostInfo)));
    
    void MainWindow::lookedUp(const QHostInfo &host)
    {
        if (host.error() != QHostInfo::NoError) {
            qDebug() << "Lookup failed:" << host.errorString();
            return;
        }
    
        foreach (const QHostAddress &address, host.addresses()) {
            // 输出IPV4、IPv6地址
            if (address.protocol() == QAbstractSocket::IPv4Protocol)
                qDebug() << "Found IPv4 address:" << address.toString();
            else if (address.protocol() == QAbstractSocket::IPv6Protocol)
                qDebug() << "Found IPv6 address:" << address.toString();
            else
                qDebug() << "Found other address:" << address.toString();
        }
    }

    输出结果:

    Found IPv4 address: “5.254.113.102”
    Found IPv4 address: “178.32.152.214”

    • 根据 IP 查询主机信息
    int nID = QHostInfo::lookupHost("5.254.113.102", this, SLOT(lookedUp(QHostInfo)));
    
    void MainWindow::lookedUp(const QHostInfo &host)
    {
        if (host.error() != QHostInfo::NoError) {
            qDebug() << "Lookup failed:" << host.errorString();
            return;
        }
    
        qDebug() << "Found hostName:" << host.hostName();
    }

    输出结果:

    Found hostName: “webredirects.cloudns.net”

    阻塞方式

    如果要使用阻塞查找使用 QHostInfo::fromName() 函数:

    QHostInfo host = QHostInfo::fromName("5.254.113.102");
    if (host.error() != QHostInfo::NoError) {
        qDebug() << "Lookup failed:" << host.errorString();
        return;
    }
    
    qDebug() << "Found hostName:" << host.hostName();

    输出结果:

    Found hostName: “webredirects.cloudns.net”

    这种情况下,名称查询的执行与调用者处于相同的线程中。这对于非 GUI 应用程序或在一个单独的、非 GUI 线程中做名称查找是比较有用的(在 GUI 线程中调用这个函数可能会导致用户界面冻结)。

    中止查询

    lookupHost() 查询主机信息时,会返回一个查询 ID,以此 ID 为参数,通过调用 abortHostLookup() 来中止查询:

    QHostInfo::abortHostLookup(nId);

    错误处理

    如果查询失败,error() 返回发生错误的类型,errorString() 返回一个能够读懂的查询错误描述。

    枚举 QHostInfo::HostInfoError:

    常量 描述
    QHostInfo::NoError 0 查找成功
    QHostInfo::HostNotFound 1 没有发现主机对应的IP地址
    QHostInfo::UnknownError 2 未知错误

    更多参考

  • 相关阅读:
    hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
    HDU 2147 kiki's game(博弈)
    C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
    C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
    C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
    C++学习44 格式化输出,C++输出格式控制
    C++学习43 输入输出有关的类和对象
    C++学习42 输入和输出的概念
    C++学习41 exception类
    C++学习40 抛出自己的异常
  • 原文地址:https://www.cnblogs.com/itrena/p/5938377.html
Copyright © 2011-2022 走看看