Qt實現(xiàn)獲取基本網(wǎng)絡信息
前言
獲取主機的網(wǎng)絡地址和接口信息是進行網(wǎng)絡編程的第一步,也是網(wǎng)絡編程的基礎(chǔ)。Qt提供了網(wǎng)絡接口類 QNetworkInterface、網(wǎng)絡地址人口類 QNetworkAddressEntry 和主機地址類 QHostAddress 來獲取和使用地址信息。其中網(wǎng)絡接口類 QNetworkInterface 描述了主機的衛(wèi)地址和接口列表,網(wǎng)絡地址人口類 QNetworkAddressEntry 用于存放 IP 地址、子網(wǎng)掩碼和廣播地址,主機地址類QHostAddress 用于定義 Qt 環(huán)境下的地址類型。
獲取網(wǎng)絡信息的步驟是:
- 首先定義 QNetworkInterface 的實例,通過 QNetworkInterface 實例的 allAddresses()方法,得到主機地址 QHostAddress 的列表。
- 如果需要獲得 IP 地址、子網(wǎng)掩碼,通過 QNetworkInterface 實例的 addressEntries()方法,獲得網(wǎng)絡地址入口 QNctworkAddressEntry 的列表。
- 如果需要獲得網(wǎng)絡物理 MAC 地址,通過 QNetworkInterface 實例的 hardwareAddress()方法,獲得網(wǎng)絡物理地址。
下面用一個綜合的例子來演示這三個類的使用,新建一個工程,設計 ui 界面,其中三個按鈕分別演示上述的三個步驟,右邊是文本瀏覽器TextBrowser 部件。
在工程文件 *.pro 中添加 network 選項后編譯:
QT+=core qui network
獲取主機IP地址
在on_pushButton_clicked()函數(shù)中直接從網(wǎng)絡接口類中獲得主機地址列表:
#include<QNetworkInterface> void MainWindow::on_pushButton_clicked() { QNetworkInterface thisComputer;//實例化網(wǎng)絡接口類 QList<QHostAddress> addressList;//創(chuàng)建主機地址列表 addressList = thisComputer.allAddresses();//獲取所有主機地址 QString displaystring;//用來存儲獲取來的地址 int i; for(i=0;i<addressList.size();i++){ displaystring+=tr("IPAddress %1:\n").arg(i+1); //前面的“%1”顯示的內(nèi)容是后面arg里面的內(nèi)容為了顯示是第幾個地址 displaystring+=addressList.at(i).toString()+"\n"; //將對應的第幾個地址添加到存儲字符串中 } ui->textBrowser->setText(displaystring);//在文本顯示區(qū)域里面顯示 }
其中 QNetworkInterface 類中 allAddresses() 方法是 QNetworkInterface 類的靜態(tài)方法,也可以用下面的代碼直接獲得地址列表。
QList<QHostAddress> addresslist = QNetworkInterface::allAddresses ()
這種方法,直接從 QNetworkInterface 獲取主機地址信息,方便快捷;缺點是不能同時獲得相應的子網(wǎng)掩碼信息。
獲取主機 IP 地址和子網(wǎng)掩碼
繼續(xù)完成 GetNetworkEntry 按鈕實現(xiàn),該按鈕的功能是從 QNetworkAddressEntry 類中獲得 IP 地址和子網(wǎng)掩碼。獲取 QNetworkAddressEntry 的方法稍微復雜一些,需要首先通過 allInterfaces() 獲得實際的網(wǎng)絡接口列表,再通過列表中的 addressEntries()函數(shù)獲得網(wǎng)絡地址人口,最后根據(jù)網(wǎng)絡地址入口檢索出 IP 地址和子網(wǎng)掩碼。
void MainWindow::on_pushButton_2_clicked() { QNetworkInterface thisComputer;//實例化網(wǎng)絡接口類 QList<QNetworkAddressEntry> addressEntry;//創(chuàng)建網(wǎng)絡地址列表 QList<QNetworkInterface> networkInterfaceList;//網(wǎng)絡接口類列表 QString displaystring; networkInterfaceList = thisComputer.allInterfaces();//獲取主機的所有網(wǎng)絡接口 int i; for(i=0; i< networkInterfaceList.size();i++){ displaystring += tr("Network Interface %1:\n").arg(i+1); //前面的“%1”顯示的內(nèi)容是后面arg里面的內(nèi)容為了顯示是第幾個網(wǎng)絡接口 displaystring += networkInterfaceList.at(i).name()+"\n"; //獲取網(wǎng)絡接口名稱 addressEntry = networkInterfaceList.at(i).addressEntries(); //獲取對應的網(wǎng)絡接口的所有子網(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 的實例,用 QHostAddress 類 toString 的方法直接輸出地址值。
獲取主機 MAC 地址
獲取主機 MAC 地址的方法和上面類似。有時候,一個網(wǎng)卡上支持了多個網(wǎng)絡接口,所以不是每個網(wǎng)絡接口都有 MAC地址,在本例子中,可以看到網(wǎng)絡接口6沒有 MAC地址。
void MainWindow::on_pushButton_3_clicked() { QNetworkInterface thisComputer;//實例化網(wǎng)絡接口類 QList<QNetworkInterface> networkInterfaceList;//網(wǎng)絡接口類列表 QString displaystring; networkInterfaceList = thisComputer.allInterfaces();//獲取主機的所有網(wǎng)絡接口 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實現(xiàn)獲取基本網(wǎng)絡信息的文章就介紹到這了,更多相關(guān)Qt獲取網(wǎng)絡信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?JSON庫?nlohmann::basic_json::array?的用法示例詳解
nlohmann::json是一個C++的JSON庫,它提供了一種容易和直觀的方法來處理JSON數(shù)據(jù),nlohmann::json::array()是用來創(chuàng)建一個JSON數(shù)組的方法,這篇文章主要介紹了C++ JSON庫nlohmann::basic_json::array的用法,需要的朋友可以參考下2023-06-06C++11新特性之右值引用與完美轉(zhuǎn)發(fā)詳解
C++11標準為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。本文就來講講二者的應用,需要的可以參考一下2022-09-09