网络编程
1.获取本地IP
1.1 API说明
获取本地IP通过QT提供的两个类QHostInfo 和QNetworkInterface 获取本地网络所有接口的信息,包含Host设备名称、网卡设备、MAC地址、IP地址、子掩码以及广播地址等。
QHostInfo:该类提供一些静态函数实现主机名称查找。
查询assistant助手得知:
QString QHostInfo::localHostName()可获取本地主机名;
QNetworkInterface:该类提供一系列Host设备IP地址以及网络接口信息。
查询帮助文档可得知以下信息,通过 QNetworkInterface以及addressEntries两个队列存储当前HOST设备下所有网络接口信息:
QList<QNetworkInterface> QNetworkInterface::allInterfaces()队列中存储主机设备所有网络接口,通过以下两个子类函数获取相关信息:
QString name()返回网卡设备;
QString hardwareAddress() 返回对应网卡设备MAC地址
QList addressEntries() 队列中存储IP地址,子掩码、广播地址等信息,通过以下几个子函数实现访问:
QHostAddress ip() 返回IP地址;
QHostAddress broadcast() 返回广播地址;
QHostAddress netmask() 返回子掩码。
1.2 设计思路
通过第一小节我们已经得知了获取本地主机设备所有网络接口的函数,通过以上所有方法可以获得例如HostName、ip、name、hardwareAddress、
boardcast、netmask等常见网络接口信息。具体C++实现如下:
/****** .h头文件 ******/
/****** author:ndtf ******/
/****** time:230222 ******/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTextBrowser>
#include <QPushButton>
#include <QTimer>
#include <QHostInfo>
#include <QNetworkInterface>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QTextBrowser *textBrowser;
QPushButton *pushButton[2];
QTimer *timer;
void layoutInit();
QString getHostInfo();
private slots:
void timerStart();
void timerTimeout();
void showHostInfo();
void cleanHostInfo();
};
#endif // MAINWINDOW_H
/****** .cpp文件 ******/
/****** author:ndtf ******/
/****** time:230222 ******/
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
layoutInit();
timer = new QTimer();
connect(pushButton[0],SIGNAL(clicked()),this,SLOT(timerStart()));
connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeout()));
connect(pushButton[1],SIGNAL(clicked()),this,SLOT(cleanHostInfo()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::layoutInit()
{
this->setGeometry(0,0,800,600);
pushButton[0] = new QPushButton(this);
pushButton[1] = new QPushButton(this);
pushButton[0]->setText("获取本机信息");
pushButton[1]->setText("清除当前信息");
pushButton[0]->setGeometry(600,200,150,50);
pushButton[1]->setGeometry(600,400,150,50);
textBrowser = new QTextBrowser(this);
textBrowser->setGeometry(30,30,500,500);
}
void MainWindow::timerStart()
{
textBrowser->clear();
timer->start(10);
}
void MainWindow::timerTimeout()
{
showHostInfo();
timer->stop();
}
void MainWindow::showHostInfo()
{
//textBrowser->setPlainText("hello");
textBrowser->setPlainText(getHostInfo());
}
QString MainWindow::getHostInfo()
{
QHostInfo hostinfo;
QString str = "主机名称:"+hostinfo.localHostName()+"\n\n";
// QHostAddress adress = hostinfo.addresses().first();
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach(QNetworkInterface interface,list)
{
str += "网卡设备:" + interface.name() + "\n";
str += "MAC地址:" + interface.hardwareAddress() + "\n";
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
foreach(QNetworkAddressEntry entry,entryList)
{
if(entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
{
str += "IP地址:" + entry.ip().toString() + "\n";
str += "子掩码:" + entry.netmask().toString() + "\n";
str += "广播地址:" + entry.broadcast().toString() + "\n\n";
}
}
}
return str;
}
void MainWindow::cleanHostInfo()
{
if(textBrowser->toPlainText().isEmpty())
{
}
textBrowser->clear();
}
1.layoutInti() 实现布局初始化,创建了textBrowser控件作为信息输出窗口,并创建了两个pushButton按钮实现信息获取及清屏操作;
2.timerStart() 、timerTimeout() 通过计时器触发getHostInfo()功能函数实现;
3.getHostInfo() 50行获取当前Host设备名称,53行声明链表存储网络接口信息,由于当前设备下可能存在多个网络设备,因此55行通过foreach遍历该List,
57~58行获取网卡设备名称及对应MCA地址。60行声明一个链表EntryLIst,遍历该list访问IP地址,子掩码,广播地址等信息;
4.cleanHostInfo() 实现清屏操作。