我正在尝试使用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的文档,但我被卡住了。
答案 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
不是有效的域名。)