当前位置: 首页 > news >正文

QT网络编程之获取本机网络信息

一.概述

查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能,Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询

1.QHostInfo 类(显示和查找本地的信息)

2.QNetworkInterface 类(获得应用程序上所在主机的所有网络接口,包括子网掩码和广播地址)

 推荐一个不错的人工智能学习网站,通俗易懂,内容全面,作为入门科普和学习提升都不错,分享一下给大家:https://www.captainbed.cn/ai

二.代码实现

1.dialog.h

#ifndef DIALOG_H

#define DIALOG_H

#include    <QDialog>

#include    <QHostInfo>

namespace Ui {

class Dialog;

}

class Dialog : public QDialog

{

    Q_OBJECT

public:

    explicit Dialog(QWidget *parent = 0);

    ~Dialog();

private slots:

    void lookedUpHostInfo(const QHostInfo &host);

    void on_btnGetHostInfo_clicked();

    void on_btnDetail_clicked();

    void on_btnLookup_clicked();

    void on_btnALLInterface_clicked();

    void on_btnClear_clicked();

private:

    Ui::Dialog *ui;

    QString  protocolName(QAbstractSocket::NetworkLayerProtocol protocol);

};

#endif // DIALOG_H

2.dialog.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()

{

    QList<QHostAddress> 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 Dialog::on_btnLookup_clicked()

{//查找主机信息

    QString hostname=ui->editHost->text(); //主机名

    ui->plainTextEdit->appendPlainText("正在查找查找主机信息:"+hostname);

    QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));

}

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");

    }

}

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";

   }

}

void Dialog::on_btnClear_clicked()

{

    ui->plainTextEdit->clear();

}

三.测试结果

1.获取本机主机名和IP

2.获取所有IP地址

3.获取所有接口

4.查找域名的ip地址

http://www.lryc.cn/news/321488.html

相关文章:

  • 离线安装docker、docker-compose、Mysql镜像
  • Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
  • 数据库基本介绍及编译安装mysql
  • 代码随想录算法训练营第55天 | 583. 两个字符串的删除操作, 72. 编辑距离
  • Guava之EventBus源码分析
  • Spark on Yarn安装配置
  • Debezium日常分享系列之:Debezium 2.5.3.Final发布
  • elment-ui el-tabs组件 每次点击后 created方法都会执行2次
  • sheng的学习笔记-AI-Network in Network(NIN)和1*1卷积
  • 【靶机测试--PHOTOGRAPHER: 1【php提权】】
  • LeetCode每日一题——删除有序数组中的重复项
  • 元宇宙VR数字化艺术展降低办展成本
  • 聚类分析 | Matlab实现基于PCA+DBO+K-means的数据聚类可视化
  • 使用 git 先提交后拉取的时候远程分支不允许问题
  • Unity 创建快捷方式开机自动启动
  • 什么是docker(docker客户端、镜像、容器、仓库)
  • [Python人工智能] 四十三.命名实体识别 (4)利用bert4keras构建Bert+BiLSTM-CRF实体识别模型
  • Android Framework开发之Linux +Vim命令
  • MySQL 索引的10 个核心要点
  • MaixSense-A010 接入 ROS
  • 使用WordPress在US Domain Center上建立招聘网站的详细教程
  • C++:类和对象(上篇)
  • 氧化铝电容的工艺结构原理及选型参数总结
  • 野火ESP8266模块开发-基于Arduino IDE
  • [Qt学习笔记]Qt实现自定义控件SwitchButton开关按钮
  • 【工具】mac 环境配置
  • 【前端寻宝之路】学习和总结HTML的标签属性
  • kafka2.x版本配置SSL进行加密和身份验证
  • Linux和Windows下的文件批量重命名
  • stm32之GPIO电路介绍