Qt 网络编程实战

news2024/10/6 2:56:13

一.获取主机的网络信息

  1. 需要添加network模块
QT   += core gui network
  1. 主要涉及的类分析

QHostInfo类

  • QHostInfo::localHostName() 获取本地的主机名
  • QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口

QNetworkInterface类

  • QNetworkInterface::allAddresses() 网卡所有的IP地址
  1. 项目效果

在这里插入图片描述

  1. 源码如下
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QHostInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

    //获取主机名
    void GetHostName();

    //获取IPV4
    void GetIPV4();

    //获取IPV6
    void GetIPV6();

    //清除文本内容
    void Clear_Text();

    //获取指定域名的IP地址
    void Get_DefineHost();
    void lookedUp(QHostInfo hostInfo);

    //主机所有网卡IP地址
    void GetAlladdresses();

    //所有网卡的网络信息
    void GetNetWorkInfo();

private:
    void InitConnectSignals();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QHostInfo>
#include<QNetworkInterface>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("主机的网络信息");
    InitConnectSignals();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::GetHostName()
{
    //获取当前的主机名
    QString hostname = QHostInfo::localHostName();
    ui->textEdit->append("当前的主机名为:"+hostname);

}

void MainWindow::GetIPV4()
{
    //获取当前的主机名
    QString hostname = QHostInfo::localHostName();

    //获取指定主机的主机信息
    QHostInfo hostinformation = QHostInfo::fromName(hostname);

    //Returns the list of IP addresses associated with hostName().
    //This list may be empty.
    //返回与hostName()相关联的IP地址列表。
    //该列表可能为空。
    QList<QHostAddress> addrlist = hostinformation.addresses();
    ui->textEdit->append("本机的IPV4地址如下:");

    if(!addrlist.isEmpty())
    {
        //for遍历输出
        for(int i=0;i<addrlist.size();i++)
        {
            //protocol是协议的意思
            if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol)
            {
                ui->textEdit->append(addrlist[i].toString());
            }
        }
    }

}

void MainWindow::GetIPV6()
{
    //获取当前的主机名
    QString hostname = QHostInfo::localHostName();

    //获取指定主机的主机信息
    QHostInfo hostinformation = QHostInfo::fromName(hostname);

    //Returns the list of IP addresses associated with hostName().
    //This list may be empty.
    //返回与hostName()相关联的IP地址列表。
    //该列表可能为空。
    QList<QHostAddress> addrlist = hostinformation.addresses();
    ui->textEdit->append("本机的IPV6地址如下:");

    if(!addrlist.isEmpty())
    {
        //for遍历输出
        for(int i=0;i<addrlist.size();i++)
        {
            //protocol是协议的意思
            if(addrlist[i].protocol()==QAbstractSocket::IPv6Protocol)
            {
                ui->textEdit->append(addrlist[i].toString());
            }
        }
    }
}

void MainWindow::Clear_Text()
{
    ui->textEdit->clear();
}

void MainWindow::Get_DefineHost()
{
    //获取lineEdit上的域名
    QString hostName =ui->lineEdit->text();
    if(hostName.isEmpty())
    {
        return ;
    }

    //获取域名的IPV4信息
    /*
     查找与主机名name相关联的IP地址,并返回用于查找的ID。当查找结果准备好时,
将使用QHostInfo参数调用receiver中的slot或信号成员。然后可以检查QHostInfo对象以获得查找结果。
      */
    //lookupHost(const QString &name, QObject *context, Func1 slot)
    QHostInfo::lookupHost(hostName,this,SLOT(lookedUp(QHostInfo)));
}

void MainWindow::lookedUp(QHostInfo hostInfo)
{
    //当前的主机名
    QString hostName=hostInfo.hostName();
    ui->textEdit->append("当前域名为:"+hostName+" IPV4信息如下:");

    QList<QHostAddress> addrlist = hostInfo.addresses();

    if(!addrlist.isEmpty())
    {
        for(int i=0;i<addrlist.count();i++)
        {
            if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol)
            {
                ui->textEdit->append(addrlist[i].toString());
            }
        }
    }

    /*
      常见的错误
QObject::connect: Incompatible sender/receiver arguments
        QHostInfoResult::resultsReady(QHostInfo) --> MainWindow::lookedUp(QHostInfo&)

        信号和槽的参数不匹配

     */
}

void MainWindow::GetAlladdresses()
{
    //获取网卡的所有IP信息
    ui->textEdit->append("所有网卡的IPV4信息如下:");
    QList<QHostAddress>addrlist = QNetworkInterface::allAddresses();
    if(!addrlist.isEmpty())
    {
        for(int i=0;i<addrlist.count();i++)
        {
            if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol)
            {
                ui->textEdit->append(addrlist[i].toString());
            }
        }
    }

}

void MainWindow::GetNetWorkInfo()
{
    //获取所有网卡的网络信息
    QList<QNetworkInterface>list =QNetworkInterface::allInterfaces();

    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface interface = list[i];
        if(!interface.isValid())
        {
            continue;
        }

        ui->textEdit->append("设备名称:"+interface.humanReadableName());
        ui->textEdit->append("硬件地址:"+interface.hardwareAddress());


        //一个网卡,可以有多个IP地址
        QList<QNetworkAddressEntry> list2 = interface.addressEntries();
        for(int j=0; j<list2.count(); j++)
        {
              QNetworkAddressEntry entry = list2[j];
              ui->textEdit->append("\tIP地址:" + entry.ip().toString());
              ui->textEdit->append("\t子网掩码:" + entry.netmask().toString());
              ui->textEdit->append("\t广播地址: " + entry.broadcast().toString() + "\n");

         }
    }

}

void MainWindow::InitConnectSignals()
{
    //void pressed();
    connect(ui->pushButton_HostName,SIGNAL(pressed()),this,SLOT(GetHostName()));

    connect(ui->pushButton_IPV4,SIGNAL(pressed()),this,SLOT(GetIPV4()));

    connect(ui->pushButton_IPV6,SIGNAL(pressed()),this,SLOT(GetIPV6()));

    connect(ui->pushButton_Clear,SIGNAL(pressed()),this,SLOT(Clear_Text()));

    connect(ui->pushButton_DefineHost,SIGNAL(pressed()),this,SLOT(Get_DefineHost()));

    connect(ui->pushButton_Alladdresses,SIGNAL(pressed()),this,SLOT(GetAlladdresses()));

    connect(ui->pushButton_Network,SIGNAL(pressed()),this,SLOT(GetNetWorkInfo()));
}

二.TCP编程

1. server编程

  • 项目效果
    在这里插入图片描述

  • 客户端
    在这里插入图片描述

  • 项目源码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QHostInfo>
#include<QTcpSocket>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitUI();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow:: InitUI()
{
    //先处理combox中的主机的IP信息,使用的是IPV4
    QString localHostName = QHostInfo::localHostName();

    QHostInfo hostInformation = QHostInfo::fromName(localHostName);

    //主机的IP地址
    QList<QHostAddress> addrlist = hostInformation.addresses();

    if(!addrlist.isEmpty())
    {
        for(int i=0;i<addrlist.count();i++)
        {
            if(addrlist[i].protocol()==QAbstractSocket::IPv4Protocol)
            {
                ui->comboBox->addItem(addrlist[i].toString());
            }
        }
    }

    //处理tcp通信
    tcpserver=new QTcpServer(this);

    //发现新信号就触发onNewConnection
    //每次有新的连接时,他的信号就会发出。
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

}


void MainWindow:: onNewConnection()
{
    //创建新的连接时,就会触发这个函数
    //创建一个新的套接字来对客户端进行服务

    /*
将下一个挂起的连接作为已连接的QTcpSocket对象返回。
套接字是作为服务器的子节点创建的,这意味着当QTcpServer对象被销毁时,
它将被自动删除。在使用完对象后显式删除它仍然是一个好主意,以避免浪费内存。
如果在没有挂起连接的情况下调用此函数,则返回Nullptr

      */
   tcpsocket=tcpserver->nextPendingConnection();

   //连接成功会触发的
   connect(tcpsocket,SIGNAL(connected()),this,SLOT(onConnected()));


   //当有数据可以读的时候,我们就读数据,(使用信号槽)
   connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));


   connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

   // void stateChanged(QAbstractSocket::SocketState);
   connect(tcpsocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
           this,SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));


}


void MainWindow::onConnected()
{
    //刚连入成功
    ui->plainTextEdit->appendPlainText("\n客户端请求已经接入!");

    //获取客户端的地址信息
    ui->plainTextEdit->appendPlainText("客户端地址:"+tcpsocket->peerAddress().toString());

    ui->plainTextEdit->appendPlainText("客户端端口号:"+QString::number(tcpsocket->peerPort()));
}

void MainWindow::onSocketReadyRead()
{
    //有数据可读时
    while(tcpsocket->canReadLine())
    {
        ui->plainTextEdit->appendPlainText("[收到]"+tcpsocket->readLine());
    }
}



void MainWindow::on_actionListen_triggered()
{
    //监听需要IP地址和端口号
    QString IP=ui->comboBox->currentText();
    QHostAddress addr(IP);

    quint16 port=ui->spinBox->value();

    //开始监听
    tcpserver->listen(addr,port);

    ui->plainTextEdit->appendPlainText("开始监听,等待客户端发起连接...");

    ui->plainTextEdit->appendPlainText("服务器地址:"+tcpserver->serverAddress().toString());
    ui->plainTextEdit->appendPlainText("服务器端口:"+QString::number(tcpserver->serverPort()));

    //更改控件
    ui->actionStop->setEnabled(true);
    ui->actionListen->setEnabled(false);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《操作系统真象还原》学习笔记:第2章——编写MBR主引导记录

2.1 计算机的启动过程 载入内存&#xff1a; &#xff08;1&#xff09; 程序被加载器&#xff08;软件或硬件&#xff09;加载到内存某个区域 &#xff08;2&#xff09;CPU 的 cs:ip 寄存器被指向这个程序的起始地址 2.2 软件接力第一棒&#xff0c;BIOS 2.2.1 实模式下的…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号&#xff0c;软件将编译生成的雷达信号任意波数据下载到信号发生器中&#xff0c;主要是1466-V矢量信号发生器&#xff0c;可实现雷达信号模拟产生。软件可模…

结构方程模型-验证性因子分析模型

初级 第7讲 验证性因子分析模_哔哩哔哩_bilibili

【matlab】【python】爬虫实战

目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代&#xff0c;数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…

7.Android逆向协议-抓取安卓http和https数据包(设备需要root权限)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;6.Android逆向协议-配置FD抓包环境 root&#xff1a; 现在的安卓手机不好搞&#xff0c;有很多坑&am…

ECSNet: Spatio-Temporal Feature Learning for Event Camera

标题&#xff1a;ECSNet&#xff1a;事件相机的空间时间特征学习 源文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656 源码&#xff1a;GitHub - zhiwen-xdu/ECSNet…

AIGC为设计师解决了什么问题?

在当今数字化时代&#xff0c;设计师们面临着前所未有的挑战和压力。他们不仅要不断创新以满足市场和客户的需求&#xff0c;还要紧跟快速变化的设计趋势和技术发展的步伐。幸运的是&#xff0c;随着生成式人工智能&#xff08;AIGC&#xff09;的兴起&#xff0c;设计师们找到…

Prometheus安装部署

1 常见部署方式 包安装 RHEL系统: https://packagecloud.io/app/prometheus-rpm/release/search 二进制安装 https://prometheus.io/download/ 基于 Docker 运行 https://prometheus.io/docs/prometheus/latest/installation/ 1.1 Docker 镜像直接启动 [root120 ~]# d…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

SPI四种模式--极性与相位

SPI的四种模式&#xff1a;相位和极性 极性 定义时钟空闲状态&#xff1a; CPOL0&#xff1a;时钟线在空闲状态为低电平 CPOL1&#xff1a;时钟线在空闲状态为高电平 这个设置决定了设备不进行通信时时钟线的状态。 兼容性&#xff1a; 不同的SPI设备可能需要不同的时钟极性…

Elasticsearch:Ingest architectures - 摄取架构

我们提供各种采集架构&#xff0c;以满足各种用例和网络配置的需求。 要将数据采集到 Elasticsearch&#xff0c;请使用最符合你的需求和用例的选项。对于许多用户和用例来说&#xff0c;最简单的方法是使用 Elastic Agent 采集数据并将其发送到 Elasticsearch。Elastic Agent…

Rhino 犀牛三维建模工具下载安装,Rhino 适用于机械设计广泛领域

Rhinoceros&#xff0c;这款软件小巧而强大&#xff0c;无论是机械设计、科学工业还是三维动画等多元化领域&#xff0c;它都能展现出其惊人的建模能力。 Rhinoceros所包含的NURBS建模功能&#xff0c;堪称业界翘楚。NURBS&#xff0c;即非均匀有理B样条&#xff0c;是计算机图…

PTrade量化软件常见问题整理系列2

一、研究界面使用get_fundamentals函数报错&#xff1a;error_info:获取token失败&#xff1f; 研究界面使用get_fundamentals函数报错&#xff1a;error_info:获取token失败&#xff1f; 1、测试版本202202.01.052&#xff0c;升级202202.01.051版本后&#xff0c;为了解决不…

卡尔曼滤波Q和R怎么调

卡尔曼滤波器是一种有效的估计算法&#xff0c;主要用于在存在噪声的环境中估计动态系统的状态。它通过结合预测模型&#xff08;系统动态&#xff09;和观测数据&#xff08;包括噪声&#xff09;来实现这一点。在卡尔曼滤波中&#xff0c;调整过程噪声协方差矩阵 ( Q ) 和测量…

idea删除分支并同步到gitLab以及gitLab上的分支删除

目录 idea删除分支并同步到gitLab 方法一&#xff08;推荐&#xff09; 方法二&#xff08;命令行&#xff09; gitLab上的分支删除 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&…

5.opencv深浅拷贝

图像处理的复制操作 深浅拷贝 图像复制分成两种&#xff0c;第一种假复制&#xff0c;从原图片选择一部分图片拿出来观察&#xff0c;此时新生成的图片和原图实际上是同一张图片&#xff0c;即浅拷贝 将图片的一部分复制下来&#xff0c;放到新的内存中&#xff0c;即两张完全…

ActiveAnno3D采用主动学习实现领域自适应,实现大规模数据集的快速标注(代码开源)

Abstract 大规模数据集的策划仍然成本高昂且需要大量时间和资源。数据通常需要手动标注&#xff0c;创建高质量数据集的挑战依然存在。在这项工作中&#xff0c;我们使用主动学习填补了多模态3D目标检测研究的空白。我们提出了ActiveAnno3D&#xff0c;这是一种主动学习框架&a…

基于香橙派AIpro搭建的车牌识别系统

引言 本人正有学习嵌入式的想法&#xff0c;正好碰到机会让我搞了块OrangePi AIpro&#xff08;香橙派AIpro&#xff09;开发板&#xff0c;正合我意&#xff0c;直接上手进行体验&#xff0c;顺便给大家分享下我的实践过程。 开发板介绍与初次启动 OrangePiAIPro开发板是香…