我正在尝试使用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的文档,但被卡住了。

最佳答案

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

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

或者,您也可以按照Qtish的方式进行操作,然后实际运行应用程序并处理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不是有效的域名。)

关于c++ - 如何使用QDnsLookup类查找网站的IP地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41144771/

10-14 10:18