《QT5.9 c++ 开发指南》第14章 网络编程(QHostInfo QNetworkInterface)

      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中的处理方式一样。

发布了40 篇原创文章 · 获赞 13 · 访问量 5889

猜你喜欢

转载自blog.csdn.net/weixin_42126427/article/details/104606068