2016-12-14 11 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は、状態を更新するQtイベントループに依存する非同期APIです。だから、あなたが待機ループでイベントを処理するためのQtを強制する必要があり、次のいずれかQDnsLookupのfinished葛を

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

またはあなたはそれをより多くのQtっぽい道を行い、実際にアプリケーションを実行し、ハンドル(ラムダは、通話をより良いかもしれません)という名前の関数が、それは単なる例です:

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(); 
} 

http://www.google.comが有効なドメイン名ではありませんので、あなたは、単にwww.google.comを使用する必要があることに注意してください)

関連する問題