ネットワークアドレス(名前またはIP)がリモートサーバーまたはローカルマシンを指しているかどうかを知りたい。私はQHostInfo
を使ってIPアドレスを調べることができますが、この場合はDNSサーバの応答を待たなければなりません。私はサーバーのIPアドレスを知りたくないので、ローカルかどうかを確認するだけです。これをチェックする方法はありますか?Qtでネットワークアドレスがローカルかどうかを確認する方法
1
A
答えて
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"
関連する問題
- 1. ネットワークパスがローカルかどうかをウィンドウで確認できます
- 2. データが ""であるかどうかを確認する方法
- 3. どうかを確認する方法
- 4. TinyMCEがWordPressでアクティブかどうかを確認する方法
- 5. ハッシュテーブルでキーがヌルかどうかを確認する方法
- 6. ローカル変数がローカル変数と等しいかどうかを確認する正しい方法
- 7. ユーザーがローカルであるかどうかを確認するLinuxでbashスクリプトを作成する方法
- 8. アンドロイドアプリがバックグラウンドかフォアグラウンドかどうかを確認する方法
- 9. コードがVisual Studio/Cassiniからローカルで実行されているかどうかを確認する方法
- 10. ブックマークがあるかどうかを確認する方法
- 11. 応答があるかどうかを確認する方法
- 12. ファイルがQtのデータベースドライバで充当されているかどうかを確認する方法
- 13. Joomla SEFがオンかどうかを確認する方法
- 14. GUIDがゼロかどうかを確認する方法
- 15. ユーザーがオンラインかどうかを確認する方法
- 16. セッションが無効かどうかを確認する方法
- 17. テキストボックスキープレスイベントハンドラのキーストロークがバックスペースかどうかを確認する方法
- 18. BLOBがヌルかどうかを確認する方法
- 19. コントロールがデザイン時かどうかを確認する方法?
- 20. オペレーティングシステムがbashrcかどうかを確認する方法
- 21. wifiオプションが有効かどうかを確認する方法
- 22. 値が数値かどうかを確認する方法
- 23. Swiftジェネリックタイプが無効かどうかを確認する方法?
- 24. URLがホームページかどうかを確認する方法
- 25. ポインタが有効かどうかを確認する方法?
- 26. SQL Server:CLRが有効かどうかを確認する方法?
- 27. req.paramsが数値かどうかを確認する方法は?
- 28. URLが外部リンクかどうかを確認する方法
- 29. 文字が整数かどうかを確認する方法
- 30. アプリケーションが実行中かどうかを確認する方法
あなたのためのローカルアドレスは何ですか? – gomons
私は、アドレスがループバックアドレスかどうか(localhostのような)、ローカルマシンを指すグローバルIPアドレスかどうかを知りたいです。 –