Qt實(shí)現(xiàn)獲取基本網(wǎng)絡(luò)信息
前言
獲取主機(jī)的網(wǎng)絡(luò)地址和接口信息是進(jìn)行網(wǎng)絡(luò)編程的第一步,也是網(wǎng)絡(luò)編程的基礎(chǔ)。Qt提供了網(wǎng)絡(luò)接口類 QNetworkInterface、網(wǎng)絡(luò)地址人口類 QNetworkAddressEntry 和主機(jī)地址類 QHostAddress 來獲取和使用地址信息。其中網(wǎng)絡(luò)接口類 QNetworkInterface 描述了主機(jī)的衛(wèi)地址和接口列表,網(wǎng)絡(luò)地址人口類 QNetworkAddressEntry 用于存放 IP 地址、子網(wǎng)掩碼和廣播地址,主機(jī)地址類QHostAddress 用于定義 Qt 環(huán)境下的地址類型。
獲取網(wǎng)絡(luò)信息的步驟是:
- 首先定義 QNetworkInterface 的實(shí)例,通過 QNetworkInterface 實(shí)例的 allAddresses()方法,得到主機(jī)地址 QHostAddress 的列表。
- 如果需要獲得 IP 地址、子網(wǎng)掩碼,通過 QNetworkInterface 實(shí)例的 addressEntries()方法,獲得網(wǎng)絡(luò)地址入口 QNctworkAddressEntry 的列表。
- 如果需要獲得網(wǎng)絡(luò)物理 MAC 地址,通過 QNetworkInterface 實(shí)例的 hardwareAddress()方法,獲得網(wǎng)絡(luò)物理地址。
下面用一個(gè)綜合的例子來演示這三個(gè)類的使用,新建一個(gè)工程,設(shè)計(jì) ui 界面,其中三個(gè)按鈕分別演示上述的三個(gè)步驟,右邊是文本瀏覽器TextBrowser 部件。

在工程文件 *.pro 中添加 network 選項(xiàng)后編譯:
QT+=core qui network
獲取主機(jī)IP地址
在on_pushButton_clicked()函數(shù)中直接從網(wǎng)絡(luò)接口類中獲得主機(jī)地址列表:
#include<QNetworkInterface>
void MainWindow::on_pushButton_clicked()
{
QNetworkInterface thisComputer;//實(shí)例化網(wǎng)絡(luò)接口類
QList<QHostAddress> addressList;//創(chuàng)建主機(jī)地址列表
addressList = thisComputer.allAddresses();//獲取所有主機(jī)地址
QString displaystring;//用來存儲(chǔ)獲取來的地址
int i;
for(i=0;i<addressList.size();i++){
displaystring+=tr("IPAddress %1:\n").arg(i+1);
//前面的“%1”顯示的內(nèi)容是后面arg里面的內(nèi)容為了顯示是第幾個(gè)地址
displaystring+=addressList.at(i).toString()+"\n";
//將對(duì)應(yīng)的第幾個(gè)地址添加到存儲(chǔ)字符串中
}
ui->textBrowser->setText(displaystring);//在文本顯示區(qū)域里面顯示
}
其中 QNetworkInterface 類中 allAddresses() 方法是 QNetworkInterface 類的靜態(tài)方法,也可以用下面的代碼直接獲得地址列表。
QList<QHostAddress> addresslist = QNetworkInterface::allAddresses ()
這種方法,直接從 QNetworkInterface 獲取主機(jī)地址信息,方便快捷;缺點(diǎn)是不能同時(shí)獲得相應(yīng)的子網(wǎng)掩碼信息。
獲取主機(jī) IP 地址和子網(wǎng)掩碼
繼續(xù)完成 GetNetworkEntry 按鈕實(shí)現(xiàn),該按鈕的功能是從 QNetworkAddressEntry 類中獲得 IP 地址和子網(wǎng)掩碼。獲取 QNetworkAddressEntry 的方法稍微復(fù)雜一些,需要首先通過 allInterfaces() 獲得實(shí)際的網(wǎng)絡(luò)接口列表,再通過列表中的 addressEntries()函數(shù)獲得網(wǎng)絡(luò)地址人口,最后根據(jù)網(wǎng)絡(luò)地址入口檢索出 IP 地址和子網(wǎng)掩碼。
void MainWindow::on_pushButton_2_clicked()
{
QNetworkInterface thisComputer;//實(shí)例化網(wǎng)絡(luò)接口類
QList<QNetworkAddressEntry> addressEntry;//創(chuàng)建網(wǎng)絡(luò)地址列表
QList<QNetworkInterface> networkInterfaceList;//網(wǎng)絡(luò)接口類列表
QString displaystring;
networkInterfaceList = thisComputer.allInterfaces();//獲取主機(jī)的所有網(wǎng)絡(luò)接口
int i;
for(i=0; i< networkInterfaceList.size();i++){
displaystring += tr("Network Interface %1:\n").arg(i+1);
//前面的“%1”顯示的內(nèi)容是后面arg里面的內(nèi)容為了顯示是第幾個(gè)網(wǎng)絡(luò)接口
displaystring += networkInterfaceList.at(i).name()+"\n";
//獲取網(wǎng)絡(luò)接口名稱
addressEntry = networkInterfaceList.at(i).addressEntries();
//獲取對(duì)應(yīng)的網(wǎng)絡(luò)接口的所有子網(wǎng)掩碼
for(int j=0;j<addressEntry.size();j++){
displaystring += addressEntry.at(j).ip().toString()+ "\n";
displaystring += addressEntry.at(j).netmask().toString()+"\n";
}
}
ui->textBrowser->setText(displaystring);
}
在上面的代碼中:addressEntry.at(j).ip()和 addressEntry. at(j).netmask()返回QHostAddress 的實(shí)例,用 QHostAddress 類 toString 的方法直接輸出地址值。

獲取主機(jī) MAC 地址
獲取主機(jī) MAC 地址的方法和上面類似。有時(shí)候,一個(gè)網(wǎng)卡上支持了多個(gè)網(wǎng)絡(luò)接口,所以不是每個(gè)網(wǎng)絡(luò)接口都有 MAC地址,在本例子中,可以看到網(wǎng)絡(luò)接口6沒有 MAC地址。
void MainWindow::on_pushButton_3_clicked()
{
QNetworkInterface thisComputer;//實(shí)例化網(wǎng)絡(luò)接口類
QList<QNetworkInterface> networkInterfaceList;//網(wǎng)絡(luò)接口類列表
QString displaystring;
networkInterfaceList = thisComputer.allInterfaces();//獲取主機(jī)的所有網(wǎng)絡(luò)接口
int i;
for(i=0;i<networkInterfaceList.size();i++){
displaystring+=tr("Network Interface %1:\n").arg(i+1);
displaystring+=networkInterfaceList.at(i).name()+ "\n";
displaystring+=networkInterfaceList.at(i).hardwareAddress()+ "\n";
}
ui->textBrowser->setText(displaystring);
}
到此這篇關(guān)于Qt實(shí)現(xiàn)獲取基本網(wǎng)絡(luò)信息的文章就介紹到這了,更多相關(guān)Qt獲取網(wǎng)絡(luò)信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++的sstream標(biāo)準(zhǔn)庫(kù)詳細(xì)介紹
以下是對(duì)C++中的的sstream標(biāo)準(zhǔn)庫(kù)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對(duì)這些方法進(jìn)行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08
C語言深入細(xì)致講解動(dòng)態(tài)內(nèi)存管理
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理2022-05-05
C語言的動(dòng)態(tài)內(nèi)存管理你了解嗎
這篇文章主要為大家詳細(xì)介紹了C語言的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例
這篇文章主要介紹了c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例,需要的朋友可以參考下2014-05-05

