Qt 网络模块提供了用于编写 TCP/IP 客户 端和服务器端程序的各种类,如用于 TCP 通信的QTcpSocket 和 QTcpServe r ,用 于 UDP 通信的 QUdpSocket , 还有用于实现 HTTP 、 FTP 等普通网络协议的高级类如 QNetworkReq uest, QNetworkReply 和 QNetworkAccessManager c Qt 网络模块还提供用于网络代理 、 网络承载管理的类,提供基于安全套接宇层( Secure Sockets Layer , SSL )协议的安全网络通信的类 。
要想运用此模块,必须工程中加上: QT += network
不然程序无法找到对应的文件。
话不多说,先上图:
对应的头文件:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QHostInfo> //必须加上 .pro QT += network
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void lookedUpHostInfo(const QHostInfo &host);
/************************************************/
void on_btnGetHostInfo_clicked();
void on_btnDetail_clicked();
void on_btnALLInterface_clicked();
void on_btnLookup_clicked();
void on_btnClear_clicked();
private:
Ui::Dialog *ui;
QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol); //
};
#endif // DIALOG_H
对应的cpp文件:
#include "dialog.h"
#include "ui_dialog.h"
#include <QHostInfo>
#include <QNetworkInterface>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::lookedUpHostInfo(const QHostInfo &host)
{
//查找主机信息的槽函数
QList<QHostAddress> addList=host.addresses();//
if(!addList.isEmpty())
{
for (int i = 0; i < addList.count();i++) {
QHostAddress ahost = addList.at(i);
bool show = ui->chkOnlyIPv4->isChecked();//只显示IPv4
if(show)
{
show = (QAbstractSocket::IPv4Protocol == ahost.protocol());
}
else {
show = true;
}
if(show)
{
ui->plainTextEdit->appendPlainText("协 议:"+protocolName(ahost.protocol()));
ui->plainTextEdit->appendPlainText(ahost.toString());
}
}
}
}
void Dialog::on_btnGetHostInfo_clicked()
{
//QHostInfo获取主机信息
QString hostName = QHostInfo::localHostName();//本地主机名
ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");
QHostInfo hostInfo = QHostInfo::fromName(hostName); //本机IP地址
QList<QHostAddress> addList = hostInfo.addresses();//IP地址列表
if(!addList.isEmpty())
{
for (int i = 0; i<addList.count();i++)
{
QHostAddress aHost = addList.at(i);//每一项是一个QHostAddress
bool show = ui->chkOnlyIPv4->isChecked();//只显示IPv4
if(show){
show = (QAbstractSocket::IPv4Protocol == aHost.protocol());
}
else {
show = true;
}
if(show)
{
ui->plainTextEdit->appendPlainText("协议:"+protocolName(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString()); //IP地址
ui->plainTextEdit->appendPlainText("");
}
}
}
}
void Dialog::on_btnDetail_clicked()
{
//QNetworkInterface::allAddresses()的使用
QList<QHostAddress> addList = QNetworkInterface::allAddresses();
if(!addList.isEmpty())
{
for (int i = 0; i<addList.count();i++)
{
QHostAddress aHost = addList.at(i);//每一项是一个QHostAddress
bool show = ui->chkOnlyIPv4->isChecked();//只显示IPv4
if(show){
show = (QAbstractSocket::IPv4Protocol == aHost.protocol());
}
else {
show = true;
}
if(show)
{
ui->plainTextEdit->appendPlainText("协议:"+protocolName(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString()); //IP地址
ui->plainTextEdit->appendPlainText("");
}
}
}
}
void Dialog::on_btnALLInterface_clicked()
{
//QNetworkInterface::allInterfaces()函数的使用
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
for (int i = 0; i<list.count();i++)
{
QNetworkInterface aInterface = list.at(i);
if(!aInterface.isValid())
continue;
ui->plainTextEdit->appendPlainText("设备名称:"+aInterface.humanReadableName());
ui->plainTextEdit->appendPlainText("硬件地址:"+aInterface.hardwareAddress());
QList<QNetworkAddressEntry> entryList = aInterface.addressEntries();
for(int j=0;j<entryList.count();j++)
{
QNetworkAddressEntry aEntry = entryList.at(j);
ui->plainTextEdit->appendPlainText(" IP 地址:"+aEntry.ip().toString());
ui->plainTextEdit->appendPlainText(" 子网掩码:"+aEntry.netmask().toString());
ui->plainTextEdit->appendPlainText(" 广播地址:"+aEntry.broadcast().toString()+"\n");
}
ui->plainTextEdit->appendPlainText("\n");
}
}
void Dialog::on_btnLookup_clicked()
{
//查找主机信息
QString hostname = ui->editHost->text();
ui->plainTextEdit->appendPlainText("正在查找查找主机信息:"+hostname);
QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));
}
void Dialog::on_btnClear_clicked()
{
ui->plainTextEdit->clear();
}
QString Dialog::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{//通过协议类型返回协议名称
switch (protocol) {
case QAbstractSocket::IPv4Protocol:
return "IPv4 Protocol";
case QAbstractSocket::IPv6Protocol:
return "IPv6 Protocol";
case QAbstractSocket::AnyIPProtocol:
return "Any IP Protocol";
default:
return "Unknown Network Layer Protocol";
}
}
对于里面的知识点这里详细解说:
1.on_btnGetHostInfo_clicked() 函数为 “获取本机主机名和 IP 地址” 按钮对应的函数:
这段代码先通过静态函数 QHostlnfo: : localHostName()获取本机主机名 hostName , 然后再使用主机名作为参数,用静态函数 QHostlnfo::fromName(hostName)获取主机的信息 hostlnfo。
返回的 addList 是 QHostAddress 类的列表 , QHostAddress 类提供一个 IP 地址的信息,包括 IPv4地址和 IPv6 地址 。
QHostAddress 有两个常用的成员函数:
- protocol()返回 QAbstractSocket::NetworkLayerProtoco l 类型变量 , 表示当前 IP 地址的协议类型。
- toString ()返回 IP 地址的字符串 , 表示程序中显示了 IP 地址列表中每个 IP 地址的协议类型和 IP 地址宇符串
为根据 protocol()返回的 QAbstractSocket::NetworkLayerProtocol 枚举值显示协议名称字符串,自定义了 一个函数 :
protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
2.通过主机来查找。
QHostlnfo 的 静态 函数 lookupHost()可 以根据 主机名 、域名或 IP 地址查找主机的地址信息
on_btnLookup_clicked() 函数里面运用这个方法
QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));
调用 lookedUpHostInfo(const QHostInfo &host) 自定义函数。
3.QNetworklnterface
QNetworklnterface 可 以获得应用程序所在主机的所有网络接口 , 包括其子网掩码和广播地址等。静态函数 QNetworkinterface : :alllnterfaces()获取所有网络接口的列表。
on_btnALLInterface_clicked() 函数里使用了这个方法。
通过 QNetworklnterface: :alllnterfaces()获取网络接口列表 list 之后 ,显示每个接口的 humanReadableName()和 hardwareAddress() 。每个接 口 又有 一个 QNetwork.AddressEntry 类型的地址列表,通过addressEntries ()获得这个列表。
QNetworkAddressEntry 包含了 一个网 络接 口的 IP 地址、 子网掩码和广播地址,分别用 ip()、netmask()和 broadcast()函 数返回。
4.通过QNetworkl nterface::allInterfaces()返回的网络接口的信息很多,如果无需知道子网掩码和广播地址等信息
返回的结果与 1中的处理方式一样。