閱讀978 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[Qt教程] 第35篇 網絡(五)獲取本機網絡信息

[Qt教程] 第35篇 網絡(五)獲取本機網絡信息

樓主
 發表於 2013-9-5 11:32:58 | 查看: 278| 回複: 2
獲取本機網絡信息


版權聲明

該文章原創於作者yafeilinux,轉載請注明出處!


導語



前麵講完了HTTPFTP,下麵本來該講解UDPTCP了。不過,在講解它們之前,我們先在這一節裏講解一個以後要經常用到的名詞,那就是IP地址。
       對於IP地址,其實,會上網的人都應該聽說過它。如果你實在很不屬性,那麼簡單的說:IP即InternetProtocol (網絡之間互聯的協議),協議就是規則,地球人都用一樣的規則,所以我們可以訪問全球任何的網站;而IP地址就是你聯網時分配給你機子的一個地址。如果把網絡比喻成地圖,那IP地址就像地圖上的經緯度一樣,它確定了你的主機在網絡中的位置。其實知道我們以後要用IP地址來代表網絡中的一台計算機就夠了。(^_^不一定科學但是很直白的表述)

下麵我們就講解如何獲取自己電腦的IP地址以及其他網絡信息。這一節中,我們會涉及到網絡模塊(QtNetworkModule)中的QHostInfo,QHostAddress,QNetworkInterface和QNetworkAddressEntry等幾個類。下麵是詳細內容。



環境:Windows Xp + Qt 4.8.5+Qt Creator2.8.0




目錄


一、使用QHostInfo獲取主機名和IP地址
二、通過QNetworkInterface類來獲取本機的IP地址和網絡接口信息




正文


一、使用QHostInfo獲取主機名和IP地址

我們新建Qt Gui應用,項目名為myIP ,基類選擇QWidget,類名保持Widget不變。完成後先打開myIP.pro文件,添加一行代碼:QT  += network ,然後保存該文件。下麵打開widget.h文件添加頭文件包含:#include <QtNetwork>

1)獲取主機名。
我們在widget.cpp文件中的構造函數中添加代碼:
QString localHostName = QHostInfo::localHostName();
qDebug() <<"localHostName: "<<localHostName;
這裏我們使用了QHostInfo類的localHostName類來獲取本機的計算機名稱。
運行程序,在下麵的應用程序輸出欄裏的信息如下:


01.jpg


可以看到,這裏獲取了計算機名。我們可以在桌麵上“我的電腦”圖標上點擊鼠標右鍵,然後選擇“屬性”菜單,查看“計算機名”一項,和這裏輸出結果是一樣的,如下圖。


02.jpg



2)獲取本機的IP地址。
我們繼續在構造函數中添加代碼:
QHostInfo info = QHostInfo::fromName(localHostName);
qDebug() <<"IP Address: "<<info.addresses();
調用QHostInfo類的fromName()函數,使用上麵獲得的主機名為參數,來獲取本機的信息。然後再利用QHostInfo類的addresses()函數,獲取本機的所有IP地址信息。運行程序,輸出信息如下:



03.jpg



在我這裏隻有一條IP地址。但是,在其他係統上,可能出現多條IP地址,其中可能包含了IPv4IPv6的地址,一般我們需要使用IPv4的地址,所以我們可以隻輸出IPv4的地址。
我們繼續添加代碼:
foreach(QHostAddress address,info.addresses())
{
     if(address.protocol() == QAbstractSocket::IPv4Protocol)
        qDebug() << address.toString();
}

因為IP地址由QHostAddress 類來管理,所以我們可以使用該類來獲取一條IP地址,然後使用該類的protocol()函數來判斷其是否為IPv4地址。如果是IPv6地址,可以使用QAbstractSocket::IPv6Protocol來判斷。最後我們將IP地址以QString類型輸出。
     我們以後要使用的IP地址都是用這個方法獲得的,所以這個一定要掌握。運行效果如下:


04.jpg



3)以主機名獲取IP地址。
在上麵講述了用本機的計算機名獲取本機的IP地址。其實QHostInfo類也可以用來獲取任意主機名的IP地址,如一個網站的IP地址。在這裏我們可以使用lookupHost()函數。它是基於信號和槽的,一旦查找到了IP地址,就會觸發槽函數。具體用法如下。
我們在widget.h文件中添加一個私有槽函數:
private slots:
void lookedUp(const QHostInfo &host);
然後在widget.cpp中的構造函數中先將上麵添加的代碼全部注釋(可以通過選中所有代碼,然後按下Ctrl+/快捷鍵來注釋代碼),然後添加以下代碼:
QHostInfo::lookupHost("www.qter.org",
                              this,SLOT(lookedUp(QHostInfo)));

這裏我們查詢Qter開源社區的IP地址,如果查找到,就會執行我們的lookedUp()函數。
widget.cpp中添加lookedUp()函數的實現代碼:

void Widget::lookedUp(const QHostInfo &host)
{
    qDebug() << host.addresses().first().toString();
}
這裏我們隻是簡單地輸出第一個IP地址。輸出信息如下:



05.jpg



其實,我們也可以使用lookupHost()函數,通過輸入IP地址反向查找主機名,隻需要將上麵代碼中的“www.qter.org”換成一個IP地址就可以了,如果你有興趣可以研究一下,不過返回的結果可能不是你想象中的那樣。
可以看到QHostInfo類的作用:通過主機名來查找IP地址,或者通過IP地址來反向查找主機名。



二、通過QNetworkInterface類來獲取本機的IP地址和網絡接口信息
QNetworkInterface類提供了程序所運行時的主機的IP地址和網絡接口信息的列表。在每一個網絡接口信息中都包含了0個或多個IP地址,而每一個IP地址又包含了和它相關的子網掩碼和廣播地址,它們三者被封裝在一個QNetworkAddressEntry對象中。網絡接口信息中也提供了硬件地址信息。我們將widge.cpp構造函數中以前添加的代碼注釋掉,然後添加以下代碼。



//獲取所有網絡接口的列表
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach(QNetworkInterface interface,list) //遍曆每一個網絡接口
{
    qDebug() << "Device: "<<interface.name(); //設備名
//硬件地址
qDebug() << "HardwareAddress: "<<interface.hardwareAddress();

//獲取IP地址條目列表,每個條目中包含一個IP地址,
//一個子網掩碼和一個廣播地址
   QList<QNetworkAddressEntry> entryList= interface.addressEntries();
    foreach(QNetworkAddressEntry entry,entryList)//遍曆每個IP地址條目
    {
       qDebug()<<"IP Address: "<<entry.ip().toString(); //IP地址
       qDebug()<<"Netmask: "<<entry.netmask().toString(); //子網掩碼
     qDebug()<<"Broadcast: "<<entry.broadcast().toString();//廣播地址
    }
}
這裏我們獲取了本機的網絡設備的相關信息。運行程序,輸出如下:


06.jpg



其實,如果我們隻想利用QNetworkInterface類來獲取IP地址,那麼就沒必要像上麵那樣複雜,這個類提供了一個便捷的函數allAddresses()來獲取IP地址,例如:
QString address = QNetworkInterface::allAddresses().first().toString();


結語


在這一節中我們學習了如何來查找本機網絡設備的相關信息。其實,以後最常用的還是其中獲取IP地址的方法。我們以後可以利用一個函數來獲取IP地址:
QString Widget::getIP()  //獲取ip地址
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
       //我們使用IPv4地址
       if(address.protocol() == QAbstractSocket::IPv4Protocol)
           return address.toString();
    }
    return 0;
}
這一節就講到這裏,在下麵的幾節中我們將利用IP地址進行UDP和TCP的編程。



涉及的源碼:  myIP.rar (1.9 KB, 下載次數: 3) 

最後更新:2017-04-03 14:54:15

  上一篇:go [Qt教程] 第19篇 2D繪圖(九)圖形視圖框架(上)
  下一篇:go [Qt教程] 第44篇 進階(四)信號和槽