我正在尝试使用 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/