如何使用QDnsLookup类查找网站的IP地址?

时间:2016-12-14 14:15:17

标签: c++ qt networking dns

我正在尝试使用Qt库学习网络编程。

作为练习,我正在尝试查找google的IP地址:

#include <QApplication>
#include <QtNetwork>

#include <iostream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDnsLookup lookup(QDnsLookup::ANY, "http://www.google.com");
    lookup.lookup();
    while (!lookup.isFinished())
    {
        // Just wait.
    }
    auto records = lookup.hostAddressRecords();
    for (auto record : records)
    {
        std::cout << record.timeToLive() << "; " <<
                     record.value().toString().toStdString() << '\n';
    }
    return 0;
}

但是,查找永远不会完成,lookup.isFinished()永远不会返回true。我试着阅读QDnsLookup的文档,但我被卡住了。

1 个答案:

答案 0 :(得分:2)

QDnsLookup是异步API,它依赖于运行以更新其状态的Qt事件循环。因此,您需要强制Qt处理等待循环中的事件:

while (!lookup.isFinished())
{
    QApplication::processEvents();
}

或者你用更多的Qt-ish方式实现它并实际运行应用程序并处理QDnsLookup的finished信号(lambda可能更好地调用命名函数,但它只是一个例子):

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDnsLookup lookup(QDnsLookup::ANY, "www.google.com");
    QObject::connect(&lookup, &QDnsLookup::finished, [&lookup]() {
        auto records = lookup.hostAddressRecords();
        for (auto record : records)
        {
            std::cout << record.timeToLive() << "; " <<
            record.value().toString().toStdString() << '\n';
        }
        QCoreApplication::quit(); // we don't want to do anything else
    });
    lookup.lookup();
    return a.exec();
}

(请注意,您应该只使用www.google.com,因为http://www.google.com不是有效的域名。)