2012-12-12 45 views
21

Qtを使用しているコンピュータのローカルIPアドレス(つまり、192.168.1.49のようなもの)を取得するためのクロスプラットフォームの方法はありますか?QtでローカルIPアドレスを取得

Symbian端末用のFTPサーバを作成したいと思います.FTPクライアントが接続するIPアドレスを表示したいとします。

答えて

32

使用QNetworkInterface::allAddresses()

foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) { 
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) 
     qDebug() << address.toString(); 
} 
+5

+1:残念ながら、仮想マシン、バーチャルボックスなどのアドレスも返します。最後の番号が ' t 1(通常は休暇のIP)&& address.toString()。section( "。"、 - 1、-1)!= "1"私はまだ地元のIPが標準的な休暇を持っていることがわかったら、ckeckの可能性を探しています。 –

12

QNetworkInterface::allAddresses()はあなたのネットワークアドレスを提供します。その後、アドレスをループバックされていないIPv4アドレスに結果を絞り込むことができます。

QList<QHostAddress> list = QNetworkInterface::allAddresses(); 

for(int nIter=0; nIter<list.count(); nIter++) 

    { 
     if(!list[nIter].isLoopback()) 
      if (list[nIter].protocol() == QAbstractSocket::IPv4Protocol) 
     qDebug() << list[nIter].toString(); 

    } 
5

あなたが(サブネットなど)だけでIPアドレスよりも多くの情報が必要な場合、あなたはすべてのインターフェイス上で繰り返し処理する必要があります。

QList<QNetworkInterface> allInterfaces = QNetworkInterface::allInterfaces(); 
QNetworkInterface eth; 

foreach(eth, allInterfaces) { 
    QList<QNetworkAddressEntry> allEntries = eth.addressEntries(); 
    QNetworkAddressEntry entry; 
    foreach (entry, allEntries) { 
     qDebug() << entry.ip().toString() << "/" << entry.netmask().toString(); 
    } 
} 
1

私は私のターゲットマシンのeth1 IPアドレスを取得したいです。上記の回答は、私が望むものを手に入れるのに役立ちました。これは、ネットワークインターフェイス名eth1のIPアドレスを取得するための関数を書いたものです。

QNetworkInterface eth1Ip = QNetworkInterface::interfaceFromName("eth1"); 
QList<QNetworkAddressEntry> entries = eth1Ip.addressEntries(); 
if (!entries.isEmpty()) { 
    QNetworkAddressEntry entry = entries.first(); 
    qDebug() << entry.ip(); 
} 
2

QNetworkInterfaceは多くのアドレスを返します。望ましい結果を得るためにそれらをフィルタリングする必要があります:

foreach (const QNetworkInterface &netInterface, QNetworkInterface::allInterfaces()) { 
    QNetworkInterface::InterfaceFlags flags = netInterface.flags(); 
    if((bool)(flags & QNetworkInterface::IsRunning) && !(bool)(flags & QNetworkInterface::IsLoopBack)){ 
     foreach (const QNetworkAddressEntry &address, netInterface.addressEntries()) { 
      if(address.ip().protocol() == QAbstractSocket::IPv4Protocol) 
       qDebug() << address.ip().toString(); 
     } 
    } 
} 
関連する問題