<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&tid=607">樓主</a>
發表于 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 <qtnetwork>
(1)擷取主機名。
我們在widget.cpp檔案中的構造函數中添加代碼:
qstring localhostname = qhostinfo::localhostname();
qdebug() <<"localhostname: "<<localhostname;
這裡我們使用了qhostinfo類的localhostname類來擷取本機的計算機名稱。
運作程式,在下面的應用程式輸出欄裡的資訊如下:
可以看到,這裡擷取了計算機名。我們可以在桌面上“我的電腦”圖示上點選滑鼠右鍵,然後選擇“屬性”菜單,檢視“計算機名”一項,和這裡輸出結果是一樣的,如下圖。
(2)擷取本機的ip位址。
我們繼續在構造函數中添加代碼:
qhostinfo info = qhostinfo::fromname(localhostname);
qdebug() <<"ip address: "<<info.addresses();
調用qhostinfo類的fromname()函數,使用上面獲得的主機名為參數,來擷取本機的資訊。然後再利用qhostinfo類的addresses()函數,擷取本機的所有ip位址資訊。運作程式,輸出資訊如下:
在我這裡隻有一條ip位址。但是,在其他系統上,可能出現多條ip位址,其中可能包含了ipv4和ipv6的位址,一般我們需要使用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位址都是用這個方法獲得的,是以這個一定要掌握。運作效果如下:
(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位址。輸出資訊如下:
其實,我們也可以使用lookuphost()函數,通過輸入ip位址反向查找主機名,隻需要将上面代碼中的“www.qter.org”換成一個ip位址就可以了,如果你有興趣可以研究一下,不過傳回的結果可能不是你想象中的那樣。
可以看到qhostinfo類的作用:通過主機名來查找ip位址,或者通過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();//廣播位址
}
這裡我們擷取了本機的網絡裝置的相關資訊。運作程式,輸出如下:
其實,如果我們隻想利用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的程式設計。
涉及的源碼:
kb, 下載下傳次數: 3)