天天看點

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&amp;tid=607">樓主</a>

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

 發表于 2013-9-5 11:32:58 | 檢視:

278| 回複: 2

擷取本機網絡資訊

版權聲明

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

導語

前面講完了http和ftp,下面本來該講解udp和tcp了。不過,在講解它們之前,我們先在這一節裡講解一個以後要經常用到的名詞,那就是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位址和網絡接口資訊

正文

我們建立qt

gui應用,項目名為myip ,基類選擇qwidget,類名保持widget不變。完成後先打開myip.pro檔案,添加一行代碼:qt  +=

network ,然後儲存該檔案。下面打開widget.h檔案添加頭檔案包含:#include &lt;qtnetwork&gt;

(1)擷取主機名。

我們在widget.cpp檔案中的構造函數中添加代碼:

qstring localhostname = qhostinfo::localhostname();

qdebug() &lt;&lt;"localhostname: "&lt;&lt;localhostname;

這裡我們使用了qhostinfo類的localhostname類來擷取本機的計算機名稱。

運作程式,在下面的應用程式輸出欄裡的資訊如下:

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

可以看到,這裡擷取了計算機名。我們可以在桌面上“我的電腦”圖示上點選滑鼠右鍵,然後選擇“屬性”菜單,檢視“計算機名”一項,和這裡輸出結果是一樣的,如下圖。

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

(2)擷取本機的ip位址。

我們繼續在構造函數中添加代碼:

qhostinfo info = qhostinfo::fromname(localhostname);

qdebug() &lt;&lt;"ip address: "&lt;&lt;info.addresses();

調用qhostinfo類的fromname()函數,使用上面獲得的主機名為參數,來擷取本機的資訊。然後再利用qhostinfo類的addresses()函數,擷取本機的所有ip位址資訊。運作程式,輸出資訊如下:

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

在我這裡隻有一條ip位址。但是,在其他系統上,可能出現多條ip位址,其中可能包含了ipv4和ipv6的位址,一般我們需要使用ipv4的位址,是以我們可以隻輸出ipv4的位址。

我們繼續添加代碼:

foreach(qhostaddress address,info.addresses())

{

     if(address.protocol()

== qabstractsocket::ipv4protocol)

        qdebug()

&lt;&lt; address.tostring();

}

因為ip位址由qhostaddress 類來管理,是以我們可以使用該類來擷取一條ip位址,然後使用該類的protocol()函數來判斷其是否為ipv4位址。如果是ipv6位址,可以使用qabstractsocket::ipv6protocol來判斷。最後我們将ip位址以qstring類型輸出。

     我們以後要使用的ip位址都是用這個方法獲得的,是以這個一定要掌握。運作效果如下:

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

(3)以主機名擷取ip位址。

在上面講述了用本機的計算機名擷取本機的ip位址。其實qhostinfo類也可以用來擷取任意主機名的ip位址,如一個網站的ip位址。在這裡我們可以使用lookuphost()函數。它是基于信号和槽的,一旦查找到了ip位址,就會觸發槽函數。具體用法如下。

我們在widget.h檔案中添加一個私有槽函數:

private slots:

void lookedup(const qhostinfo &amp;host);

然後在widget.cpp中的構造函數中先将上面添加的代碼全部注釋(可以通過選中所有代碼,然後按下ctrl+/快捷鍵來注釋代碼),然後添加以下代碼:

qhostinfo::lookuphost("www.qter.org",

                              this,slot(lookedup(qhostinfo)));

這裡我們查詢qter開源社群的ip位址,如果查找到,就會執行我們的lookedup()函數。

在widget.cpp中添加lookedup()函數的實作代碼:

void widget::lookedup(const qhostinfo &amp;host)

    qdebug() &lt;&lt; host.addresses().first().tostring();

這裡我們隻是簡單地輸出第一個ip位址。輸出資訊如下:

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

其實,我們也可以使用lookuphost()函數,通過輸入ip位址反向查找主機名,隻需要将上面代碼中的“www.qter.org”換成一個ip位址就可以了,如果你有興趣可以研究一下,不過傳回的結果可能不是你想象中的那樣。

可以看到qhostinfo類的作用:通過主機名來查找ip位址,或者通過ip位址來反向查找主機名。

qnetworkinterface類提供了程式所運作時的主機的ip位址和網絡接口資訊的清單。在每一個網絡接口資訊中都包含了0個或多個ip位址,而每一個ip位址又包含了和它相關的子網路遮罩和廣播位址,它們三者被封裝在一個qnetworkaddressentry對象中。網絡接口資訊中也提供了硬體位址資訊。我們将widge.cpp構造函數中以前添加的代碼注釋掉,然後添加以下代碼。

//擷取所有網絡接口的清單

qlist&lt;qnetworkinterface&gt; list

= qnetworkinterface::allinterfaces();

foreach(qnetworkinterface interface,list)

//周遊每一個網絡接口

    qdebug()

&lt;&lt; "device: "&lt;&lt;interface.name(); //裝置名

//硬體位址

qdebug() &lt;&lt; "hardwareaddress: "&lt;&lt;interface.hardwareaddress();

//擷取ip位址條目清單,每個條目中包含一個ip位址,

//一個子網路遮罩和一個廣播位址

   qlist&lt;qnetworkaddressentry&gt; entrylist=

interface.addressentries();

    foreach(qnetworkaddressentry entry,entrylist)//周遊每個ip位址條目

    {

       qdebug()&lt;&lt;"ip

address: "&lt;&lt;entry.ip().tostring(); //ip位址

       qdebug()&lt;&lt;"netmask:

"&lt;&lt;entry.netmask().tostring(); //子網路遮罩

     qdebug()&lt;&lt;"broadcast:

"&lt;&lt;entry.broadcast().tostring();//廣播位址

    }

這裡我們擷取了本機的網絡裝置的相關資訊。運作程式,輸出如下:

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

其實,如果我們隻想利用qnetworkinterface類來擷取ip位址,那麼就沒必要像上面那樣複雜,這個類提供了一個便捷的函數alladdresses()來擷取ip位址,例如:

qstring address = qnetworkinterface::alladdresses().first().tostring();

結語

在這一節中我們學習了如何來查找本機網絡裝置的相關資訊。其實,以後最常用的還是其中擷取ip位址的方法。我們以後可以利用一個函數來擷取ip位址:

qstring widget::getip()  //擷取ip位址

    qlist&lt;qhostaddress&gt; list = qnetworkinterface::alladdresses();

    foreach (qhostaddress address, list)

       //我們使用ipv4位址

       if(address.protocol() == qabstractsocket::ipv4protocol)

           return address.tostring();

    return 0;

這一節就講到這裡,在下面的幾節中我們将利用ip位址進行udp和tcp的程式設計。

涉及的源碼: 

[Qt教程] 第35篇 網絡(五)擷取本機網絡資訊 [Qt教程] 第35篇 網絡(五)擷取本機網絡資訊

kb, 下載下傳次數: 3) 

繼續閱讀