6

QT でコンピューターのローカル IP アドレス (IPV4) を取得しようとしています。次のコードを見つけました。

QNetworkInterface *inter = new QNetworkInterface();
QList<QHostAddress> list;
list=inter->allAddresses();
QString str;

for (int i = 0; i < list.size(); ++i) {
     str = list.at(i).toString();
}

for ループを通過すると、 に多数の値 (ip) があることがわかります。そのうちの 1 つは、コマンド ウィンドウにlist入力して取得した実際のローカル IP アドレスです。ipconfig

私の質問は、にあるすべての IP から IP アドレスを区別する方法listです。

4

2 に答える 2

11

多くの場合、PC には複数の IP アドレスがあります。「その」ローカル IP アドレスのようなものは実際にはありません。リモート ホストに接続するときに使用される IP アドレスは、少なくともローカル ルーティング テーブルに依存します (VPN ソフトウェアの開始/停止時など、いつでも大幅に変更される可能性があります)。

IP はリモート ネットワークのコンテキストでのみ有効であると考える方が理にかなっているように思えます。たとえば、「これは、インターネット上のこのホストに接続する場合に使用するローカル IP アドレスですが、これは会社の VPN 経由でこのホストに接続するために使用するローカル IP アドレス」.

汎用のインターネット接続に使用されるローカル IP アドレスを知りたい場合、私が知っている最も正確な方法は、代表的なホスト (および信頼性の高いホスト) への接続テストを行うことです。

QTcpSocket socket;
socket.connectToHost("8.8.8.8", 53); // google DNS, or something else reliable
if (socket.waitForConnected()) {
    qDebug()
        << "local IPv4 address for Internet connectivity is"
        << socket.localAddress();
} else {
    qWarning()
        << "could not determine local IPv4 address:"
        << socket.errorString();
}

注: 上記の例はブロッキングです。アプリに UI がある場合は、おそらくシグナルとスロットを使用するように書き直す必要があります。

于 2012-10-17T05:53:19.030 に答える
2

GUESSの可能性を高めるために、いくつかの試みを試みる必要があると思います(ソフトウェアがどれほど賢いかに関係なく、それはまだ推測であり、おそらくあなたのケースになる構成の1%をカバーしません:-)

両方のソリューションを組み合わせて拡張しました。最初に Google DNS をチェックし、次に標準ゲートウェイを持つローカル IP をチェックします。前提は次のとおりです。Getaway には、アドレスが「.1」で終わる同じマスクがあります。stdの取得方法がわかりませんでした。Qt のゲートウェイ (より信頼性が高くなります)。

MY COMPUTERSで動作するコードは次のとおりです。

    QTcpSocket dnsTestSocket;   
    QString localIP="127.0.0.1";    //fall back
    QString googleDns = "8.8.8.83";  //try google DNS or sth. else reliable first
    dnsTestSocket.connectToHost(googleDns, 53);
    if (dnsTestSocket.waitForConnected(3000)) 
    {
        localIP = dnsTestSocket.localAddress().toString();
    } 
    else 
    {
        foreach (const QHostAddress &address, QNetworkInterface::allAddresses())
        {
            QString guessedGatewayAddress = address.toString().section( ".",0,2 ) + ".1";

            if (address.protocol() == QAbstractSocket::IPv4Protocol 
                && address != QHostAddress(QHostAddress::LocalHost)
                )
            {
                dnsTestSocket.connectToHost(guessedGatewayAddress, 53);
                if (dnsTestSocket.waitForConnected(3000))
                {
                    localIP = dnsTestSocket.localAddress().toString();
                    break;
                }
            }   
        }
    }
于 2013-06-25T10:14:43.387 に答える