qt獲得本地IP的方法,qt中域名解析的方法


本文博客鏈接:http://blog.csdn.net/jdh99,作者:jdh,轉載請注明.

環境:Ubuntu10.04 + Qt4.7.0

Linux獲得本地IP的方法,我嘗試了兩種

1.用QHostInfo類解析

QHostInfo類可以解析域名,理論上也可以解析本地IP,可是經過嘗試,我發現解析出來的IP是127.0.0.1是本地回環地址,不符合我的需求。

代碼:

 

[cpp]  view plain  copy
 
  1. //獲取本地IP  
  2.     QHostInfo info=QHostInfo::fromName(QHostInfo::localHostName());  
  3.     //QHostInfo info=QHostInfo::fromName("www.google.com");  
  4.     //Sys_Res.local_ip = info.addresses().first().toString();  
  5.     //qDebug() << Sys_Res.local_ip;  
  6.   
  7.     if (info.error() != QHostInfo::NoError)  
  8.     {  
  9.          qDebug() << "Lookup failed:" << info.errorString();  
  10.          return;  
  11.     }  
  12.   
  13.     for (int i = 0;i < info.addresses().size();i++)  
  14.     {  
  15.          qDebug() << "Found address:" << info.addresses()[i].toString() << endl;  
  16.     }  


2.用QNetworkInterface解析

 

用這個類可以獲取系統底層的網絡參數,經過實踐是可行的,我參考的文章:http://qt.csdn.net/articles.aspx?pointid=489&pointid2=7

參考代碼截取:

 

[cpp]  view plain  copy
 
  1. 2.通過QNetworkInterface類來獲取本機的IP地址和網絡接口信息。  
  2. QNetworkInterface類提供了程序所運行時的主機的IP地址和網絡接口信息的列表。在每一個網絡接口信息中都包含了0個或多個IP地址,而每一個IP地址又包含了和它相關的子網掩碼和廣播地址,它們三者被封裝在一個QNetworkAddressEntry對象中。網絡接口信息中也提供了硬件地址信息。我們將widge.cpp構造函數中以前添加的代碼刪除,然后添加以下代碼。  
  3. QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();  
  4.     //獲取所有網絡接口的列表  
  5.     foreach(QNetworkInterface interface,list)  
  6.     {  //遍歷每一個網絡接口  
  7.         qDebug() << “Device: “<<interface.name();  
  8.         //設備名  
  9.         qDebug() << “HardwareAddress: “<<interface.hardwareAddress();  
  10.         //硬件地址  
  11.         QList<QNetworkAddressEntry> entryList = interface.addressEntries();  
  12.      //獲取IP地址條目列表,每個條目中包含一個IP地址,一個子網掩碼和一個廣播地址  
  13.         foreach(QNetworkAddressEntry entry,entryList)  
  14.         {//遍歷每一個IP地址條目  
  15.             qDebug()<<”IP Address: “<<entry.ip().toString();  
  16.             //IP地址  
  17.             qDebug()<<”Netmask: “<<entry.netmask().toString();  
  18.             //子網掩碼  
  19.             qDebug()<<”Broadcast: “<<entry.broadcast().toString();  
  20.             //廣播地址  
  21.         }  
  22. }  
[cpp]  view plain  copy
 
  1. 其實,如果我們只想利用QNetworkInterface類來獲取IP地址,那么就沒必要像上面那樣復雜,這個類提供了一個便捷的函數allAddresses()來獲取IP地址,例如:  
  2. QString address = QNetworkInterface::allAddresses().first().toString();  
  3. 3.總結。  
  4. 在這一節中我們學習了如何來查找本機網絡設備的相關信息。其實,以后最常用的還是其中獲取IP地址的方法。我們以后可以利用一個函數來獲取IP地址:  
  5. QString Widget::getIP()  //獲取ip地址  
  6. {  
  7.     QList<QHostAddress> list = QNetworkInterface::allAddresses();  
  8.     foreach (QHostAddress address, list)  
  9.     {  
  10.        if(address.protocol() == QAbstractSocket::IPv4Protocol)  
  11. //我們使用IPv4地址  
  12.             return address.toString();  
  13.     }  
  14.        return 0;  
  15. }  


把這段代碼嵌入到我的程序中:

 

 

[cpp]  view plain  copy
 
    1. QList<QHostAddress> list = QNetworkInterface::allAddresses();  
    2.     foreach (QHostAddress address, list)  
    3.     {  
    4.         if(address.protocol() == QAbstractSocket::IPv4Protocol)  
    5.         {  
    6.             //IPv4地址  
    7.             if (address.toString().contains("127.0."))  
    8.             {  
    9.                 continue;  
    10.             }  
    11.             Sys_Res.local_ip = address.toString();  
    12.         }  
    13.     }  
    14.     if (Sys_Res.local_ip == "127.0.0.1")  
    15.     {  
    16.         qDebug() << "get local ip fail";  
    17.         return;  
    18.     }  
    19.     else  
    20.     {  
    21.         qDebug() << Sys_Res.local_ip;  
    22.     }  

http://blog.csdn.net/jdh99/article/details/6679692

 

qt中提供了可以實現域名解析功能的類QHostInfo,這個類解析域名提供兩種機制,一種是阻塞式,一種是非阻塞信號槽機制,下面介紹第二種機制的實現方法。

 

qt的幫助中給出了這個類的例子:

 

[cpp]  view plain  copy
 
  1. QHostInfo::lookupHost("www.kde.org",this, SLOT(lookedUp(QHostInfo)));  
  2.   
  3. //當解析成功域名后,會調用lookedUp槽函數  
  4. void MyWidget::lookedUp(const QHostInfo &host)  
  5.  {  
  6.      if (host.error() != QHostInfo::NoError) {  
  7.          qDebug() << "Lookup failed:" << host.errorString();  
  8.          return;  
  9.      }  
  10.   
  11.      foreach (QHostAddress address, host.addresses())  
  12.          qDebug() << "Found address:" << address.toString();  
  13.  }  

 

 

 

仿照這個例子,我做了google域名的解析測試

 

[cpp]  view plain  copy
 
  1. QHostInfo::lookupHost("www.google.com",this,SLOT(slot_get_ip(QHostInfo)));  
  2.   
  3. void test::slot_get_ip(QHostInfo host_info)  
  4. {  
  5.     if (host_info.error() != QHostInfo::NoError)  
  6.     {  
  7.          qDebug() << "Lookup failed:" << host_info.errorString();  
  8.          return;  
  9.     }  
  10.   
  11.     for (int i = 0;i < host_info.addresses().size();i++)  
  12.     {  
  13.          qDebug() << "Found address:" << host_info.addresses()[i].toString() << endl;  
  14.     }  
  15. }  

 

在調試窗口可以看到解析結果:

 

[cpp]  view plain  copy
 
    1. Found address: "64.233.183.106"   
    2.   
    3. Found address: "64.233.183.147"   
    4.   
    5. Found address: "64.233.183.99"   
    6.   
    7. Found address: "64.233.183.103"   
    8.   
    9. Found address: "64.233.183.104"   
    10.   
    11. Found address: "64.233.183.105"   

 

http://blog.csdn.net/jdh99/article/details/6675670


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM