2016-12-14 218 views
0

我想学习与Qt库的网络编程。如何使用QDnsLookup类查找网站的IP地址?

锻炼,我想查找谷歌的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的文档,但我卡住了。

回答

2

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

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

,或者你做的更多的Qt十岁上下的方式和实际运行的应用程序和处理finished葛QDnsLookup的(拉姆达可能更好的通话一个名为功能,但它只是一个例子):

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是不是一个有效的域名)