点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达

想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获

    Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP、FTP等普通网络协议的高级类如 QNetworkRequest, QNetworkReply 和QNetworkAccessManager。Qt 网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(Secure Sockets Layer, SSL)协议的安全网络通信的类。    要在程序中使用Qt网络模块,需要在项目中配置Network模块

46421015f78ecf17bc4a1e8195e43c5a.png

1主机信息查询    1.1 QHostlnfo 和 QNetworklnterface 类    查询一个主机的MAC地址或IP地址是网络应用程序中经常用到的功能,Qt提供了 QHostlnfo和QNetworklnterface类可以用于此类信息的查询。QHostlnfo的静态函数localHostName()可获取本机的主机名,静态函数fromName()可以通过主机名获取IP地址,静态函数lookuPHost()可以通过一个主机名,以异步方式查找这个主机的IP地址    QHostlnfo的主要函数如下

  • QList addresses()

    • 返回与hostName()主机关联的IP地址列表

  • HostInfoError error()

    • 如果主机查找失败,返回失败类型

  • QString errorString()

    • 如果主机查找失败,返回错误描述字符串

  • QString hostName()

    • 返回通过IP查找的主机的名称

  • int lookupld()

    • 返回本次查找的ID

  • void abortHostLookup(int id)

    • 中断主机查找

  • QHostlnfo fromName(QString &name)

    • 返回指定的主机名的IP地址

  • QString localDomainName()

    • 返回本机DNS域名

  • QString localHostName()

    • 返回本机主机名

  • int lookupHost(QString &name, QObject receiver, char *member)

    • 以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于ahortHostlookup()

    QNetworklnterface可以获得运行应用程序的主机的所有IP地址和网络接口列表。静态函数alllnterfaces()返回主机上所有的网络接口的列表,一个网络接口可能包括多个的丨P地址,每个IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的IP地址,使用静态函数allAddresses()可以获得主机上的所有IP地址列表。

  • QList addressEntries()

    • 返回该网络接口(包括子网掩码和广播地址)的ip地址列表

  • QString hardwareAddress()

    • 返回该接口的低级硬件地址,以太网里就是MAC地址

  • QString humanReadableName()

    • 返回可以读懂的接口名称,如果名称不确定,得到的就是name()函数的返回值

  • bool isValid()

    • 如果接口信息有效就返回true

  • QString name()

    • 返回网络接口名称

  • QList allAddresses()

    • 返回主机上所有IP地址的列表

  • QList alllnterfaces()

    • 返回主机上所有接口的网络列表

实例如下:

b2d71241c53b5c844a57428b7332fad7.png

头文件

#pragma once#include #include "ui_QGuiInternet.h"#include class QGuiInternet : public QWidget{    Q_OBJECTpublic:    QGuiInternet(QWidget *parent = Q_NULLPTR);    ~QGuiInternet();private:    Ui::QGuiInternet ui;    //通过协议类型返回协议名称    QString  protocolName(QAbstractSocket::NetworkLayerProtocol protocol);private slots:    void lookedUpHostInfo(const QHostInfo& host);    void btnGetHostInfo_clicked();//获取本机主机名和IP地址    void btnDetail_clicked();    void btnALLInterface_clicked();    void btnLookup_clicked(); //查找域名的IP地址    void btnClear_clicked();//清空文本}

源文件

#include "QGuiInternet.h"#include #pragma execution_character_set("utf-8")QGuiInternet::QGuiInternet(QWidget *parent)    : QWidget(parent){    ui.setupUi(this);    connect(ui.btnGetHostInfo, SIGNAL(clicked()), this, SLOT(btnGetHostInfo_clicked()));    connect(ui.btnDetail, SIGNAL(clicked()), this, SLOT(btnDetail_clicked()));    connect(ui.btnALLInterface, SIGNAL(clicked()), this, SLOT(btnALLInterface_clicked()));    connect(ui.btnLookup, SIGNAL(clicked()), this, SLOT(btnLookup_clicked()));    connect(ui.btnClear, SIGNAL(clicked()), this, SLOT(btnClear_clicked()));}QGuiInternet::~QGuiInternet(){}//通过协议类型返回协议名称QString QGuiInternet::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";    }}void QGuiInternet::lookedUpHostInfo(const QHostInfo& host){    //查找主机信息的槽函数    QList addList = host.addresses();    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(aHost.toString()); //IP地址            }        }    }}//获取本机主机名和IP地址void QGuiInternet::btnGetHostInfo_clicked(){    QString hostName = QHostInfo::localHostName();//本地主机名    ui.plainTextEdit->appendPlainText("本地主机名:" + hostName + "\n");    QHostInfo hostInfo = QHostInfo::fromName(hostName);//本地IP地址    QList 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 QGuiInternet::btnDetail_clicked(){    QList addList = QNetworkInterface::allAddresses();//    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("IP地址:" + aHost.toString());                ui.plainTextEdit->appendPlainText("");            }        }    }}void QGuiInternet::btnALLInterface_clicked(){    QListlist = 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 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");    }}//查找域名的IP地址void QGuiInternet::btnLookup_clicked(){    //查找主机信息    QString hostName = ui.editHost->text();//主机名    ui.plainTextEdit->appendPlainText("正在查找查找主机信息:" + hostName);    QHostInfo::lookupHost(hostName, this, SLOT(lookedUpHostInfo(QHostInfo)));}//清空文本void QGuiInternet::btnClear_clicked(){    ui.plainTextEdit->clear();}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐