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

标签 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 的文档,但我被困住了。

最佳答案

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

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

或者您以更 Qt 的方式执行此操作,实际运行应用程序并处理 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/

相关文章:

c++ - 成员函数的附加语法/说明符如何影响类中的内存布局?

c++ - QTableWidget - 组合框委托(delegate)我如何允许每个单元格有不同的选项

c++ - 如何使 QGraphicsTextItem 单行?

java - 如何知道 HttpURLConnection 是否确实在底层套接字上发送了请求?

networking - tcpdump 将 tcp 流量过滤到 csv 文件中

c++ - C++中未设置的 boolean 值的默认值?

c++ - 类名没有命名模板继承的类型问题

c++ - 将多个文件添加到输出以用于额外的编译器 Qt

linux - 从网络脚本中手动删除接口(interface)时,ifconfig不会更新

c++ - 如何在选中/取消选中时更改 QToolBar 上 QAction 的图标?