2016-12-14 44 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是不是一個有效的域名)