2016-03-30 6 views
1

ネットワークアドレス(名前またはIP)がリモートサーバーまたはローカルマシンを指しているかどうかを知りたい。私はQHostInfoを使ってIPアドレスを調べることができますが、この場合はDNSサーバの応答を待たなければなりません。私はサーバーのIPアドレスを知りたくないので、ローカルかどうかを確認するだけです。これをチェックする方法はありますか?Qtでネットワークアドレスがローカルかどうかを確認する方法

+1

あなたのためのローカルアドレスは何ですか? – gomons

+0

私は、アドレスがループバックアドレスかどうか(localhostのような)、ローカルマシンを指すグローバルIPアドレスかどうかを知りたいです。 –

答えて

0

私はQHostInfoを使用してIPアドレスを検索できますが、この場合はDNSサーバーの応答を待たなければなりません。

QHostInfoは、プラットフォーム固有の名前解決メカニズムを使用します。 DNSをまったく使用しないかもしれません。ローカルインターフェイスのホスト名がhostsファイルにあり、名前解決がそれを使用するように設定されている場合、QHostInfoはそのようにローカルインターフェイスのアドレスを解決します。それ以外の場合は、プラットフォームが名前をそのように解決するように設定されている場合は、ネームサーバーのクエリを実行します。

最も可能なことは、QHostAddress::isLoopback()を確認し、QNetworkInterface::allAddresses()のいずれかであることを確認することです。

アドレスがIPアドレスではなく、QHostInfo::localHostName()と等しくない場合は、最初にQHostInfo::lookupHostを使用して取得する必要があります。ホスト・ファイルまたは同様のローカル解決メカニズムにリストされているローカル・インタフェースの名前の場合は、すぐに戻されます。短いタイムアウト(例えば100ms)を設定することができ、それまでに利用可能な検索結果がない場合は、ローカルインタフェースではないとみなすことができます。

はここに例を示します

// https://github.com/KubaO/stackoverflown/tree/master/questions/host-lookup-36319049 
#include <QtWidgets> 
#include <QtNetwork> 

class IfLookup : public QObject { 
    Q_OBJECT 
    int m_id; 
    QTimer m_timer; 
    void abort() { 
     if (m_timer.isActive()) 
     QHostInfo::abortHostLookup(m_id); 
     m_timer.stop(); 
    } 
    Q_SLOT void lookupResult(const QHostInfo & host) { 
     m_timer.stop(); 
     if (host.error() != QHostInfo::NoError) 
     return hasResult(Error); 
     for (auto ifAddr : QNetworkInterface::allAddresses()) 
     if (host.addresses().contains(ifAddr)) 
      return hasResult(Local); 
     return hasResult(NonLocal); 
    } 
public: 
    enum Result { Local, NonLocal, TimedOut, Error }; 
    IfLookup(QObject * parent = 0) : QObject(parent) { 
     connect(&m_timer, &QTimer::timeout, this, [this]{ 
     abort(); 
     emit hasResult(TimedOut); 
     }); 
    } 
    Q_SIGNAL void hasResult(Result); 
    Q_SLOT void lookup(QString name) { 
     abort(); 
     name = name.trimmed().toUpper(); 
     QHostAddress addr(name); 
     if (!addr.isNull()) { 
     if (addr.isLoopback() || QNetworkInterface::allAddresses().contains(addr)) 
      return hasResult(Local); 
     return hasResult(NonLocal); 
     } 
     if (QHostInfo::localHostName() == name) 
     return hasResult(Local); 
     m_id = QHostInfo::lookupHost(name, this, SLOT(lookupResult(QHostInfo))); 
     m_timer.start(500); 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget w; 
    QFormLayout layout{&w}; 
    QLineEdit address; 
    layout.addRow("Address to look up", &address); 
    QLabel result; 
    layout.addRow("Result", &result); 
    QPushButton lookup{"Lookup"}; 
    layout.addRow(&lookup); 
    lookup.setDefault(true); 
    w.show(); 

    IfLookup ifLookup; 
    QObject::connect(&lookup, &QPushButton::clicked, [&]{ 
     result.clear(); 
     ifLookup.lookup(address.text()); 
    }); 
    QObject::connect(&ifLookup, &IfLookup::hasResult, [&](IfLookup::Result r){ 
     static const QMap<IfLookup::Result, QString> msgs = { 
     { IfLookup::Local, "Local" }, { IfLookup::NonLocal, "Non-Local" }, 
     { IfLookup::TimedOut, "Timed Out" }, { IfLookup::Error, "Lookup Error" } 
     }; 
     result.setText(msgs.value(r)); 
    }); 

    return app.exec(); 
} 

#include "main.moc" 
関連する問題