72-UDP协议工作原理及实战

#ifndef UDPCOMM_H
#define UDPCOMM_H

#include <QMainWindow>
#include <QUdpSocket> // 用于发送和接收UDP数据报
#include <QtNetwork>


QT_BEGIN_NAMESPACE
namespace Ui { class udpComm; }
QT_END_NAMESPACE

class udpComm : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_start_clicked();

    void on_pushButton_stop_clicked();

    void on_pushButton_sengmsg_clicked();

    void on_pushButton_broadastmsg_clicked();

private:
    Ui::udpComm *ui;
    // 自定义函数获取本机的IP地址
public:
    QUdpSocket *udpsocket;

    QString GetLocalIpAddress(); // 获取本机IP地址

    // 自己定义槽
private slots:
    void  SocketReadyReadData(); // 读取socket传输数据信息
};
#endif // UDPCOMM_H



//.c




#include "udpcomm.h"
#include "ui_udpcomm.h"
#include <QMessageBox>

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

    QString strip=GetLocalIpAddress(); // 调用此函数返回对应本机IP地址
    QMessageBox::information(this,"结果",strip,QMessageBox::Yes);

    ui->comboBoxtargetip->addItem(strip); // 将IP地址显示到comboBox控件

    udpsocket=new QUdpSocket(this);

    connect(udpsocket,SIGNAL(readyRead()),this,SLOT(SocketReadyReadData()));

}

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


void udpComm::on_pushButton_start_clicked()
{

    quint16 port=ui->spinBoxbindport->value(); // 本机UDP端口

    if(udpsocket->bind(port))
    {
        ui->plainTextEditdispmsg->appendPlainText("**********绑定成功**********");
        ui->plainTextEditdispmsg->appendPlainText("$$$$$$$$$$绑定端口$$$$$$$$$$:"+
                                                  QString::number(udpsocket->localPort()));
        ui->pushButton_start->setEnabled(false);
        ui->pushButton_stop->setEnabled(true);

    }
    else
    {
        ui->plainTextEditdispmsg->appendPlainText("**********绑定失败**********");
    }
}


void udpComm::on_pushButton_stop_clicked()
{
    udpsocket->abort();
    ui->pushButton_start->setEnabled(true);
    ui->pushButton_stop->setEnabled(false);
    ui->plainTextEditdispmsg->appendPlainText("**********已经停止服务**********");

}


void udpComm::on_pushButton_sengmsg_clicked()
{
    QString targetIpAddress=ui->comboBoxtargetip->currentText(); // 获取目标IP地址
    QHostAddress targetaddress(targetIpAddress);

    quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口

    QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容

    QByteArray str=strmsg.toUtf8();

    udpsocket->writeDatagram(str,targetaddress,targetport); // 发送数据报信息

    ui->plainTextEditdispmsg->appendPlainText("[out]:"+str);
    ui->lineEditmsg->clear(); // 清除编辑框控件内容
    ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件

}


void udpComm::on_pushButton_broadastmsg_clicked()
{

 quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口
    QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容
    QByteArray str=strmsg.toUtf8();

    udpsocket->writeDatagram(str,QHostAddress::Broadcast,targetport); // 发送数据报信息

    ui->plainTextEditdispmsg->appendPlainText("[broadcast]:"+str);
    ui->lineEditmsg->clear(); // 清除编辑框控件内容
    ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件
}

QString udpComm::GetLocalIpAddress()
{

    // 根据主机名称,获取IP地址
    QString strHostName=QHostInfo::localHostName();
    QHostInfo hostinfo=QHostInfo::fromName(strHostName); //  通过主机名称获取IP地址

    QString strLocalIp="";

    QList<QHostAddress> addresslist=hostinfo.addresses(); // IP地址列表

    if(!addresslist.isEmpty())
    {
        for(int i=0;i<addresslist.count();i++)
        {
            QHostAddress hostaddr=addresslist.at(i);

            if(QAbstractSocket::IPv4Protocol==hostaddr.protocol())
            {
                strLocalIp=hostaddr.toString();
                break;
            }
        }
    }

    return strLocalIp;
}

void udpComm::SocketReadyReadData()
{

    // 读取接收到的数据报信息
    // 用此函数返回true至少有一个数据报需要读取
    while(udpsocket->hasPendingDatagrams())
    {
        QByteArray datagrams;

        datagrams.resize(udpsocket->pendingDatagramSize());

        QHostAddress paddress;
        quint16 pport;

        // 通过readDatagram()此函数读取数据报,
        udpsocket->readDatagram(datagrams.data(),datagrams.size(),&paddress,&pport);

        QString strs=datagrams.data();
        QString peer="[From:"+paddress.toString()+":"+QString::number(pport)+"]:";

        ui->plainTextEditdispmsg->appendPlainText(peer+strs);
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生引领智慧校园建设新篇章

一、引言 在数字化浪潮的推动下&#xff0c;教育行业正经历着一场深刻的变革。智慧校园作为现代教育的新风向&#xff0c;通过整合先进的信息技术&#xff0c;正在逐步改变传统的教学、管理与服务模式。其中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为智慧校园的建…

聊聊系统架构之负载均衡优化实践

一、写在前面 最近在进行线上监控检查时&#xff0c;我遇到了两个超出预期的案例。首先&#xff0c;网关层的监控数据与应用实际监控数据存在不一致性&#xff0c;尤其是max有较大的差异&#xff0c;详见如下图。其次在某个应用中&#xff0c;通过httpclient请求某域名时发现只…

VST3音频插件技术介绍

一.概述 1.VST3介绍 VST3&#xff08;Virtual Studio Technology 3&#xff09;是一种音频插件格式&#xff0c;由Steinberg公司开发&#xff0c;用于在数字音频工作站&#xff08;DAW&#xff09;中使用。VST3插件可以是模拟合成器、鼓机、混响器、压缩器等多种类型的音频处理…

AI在医学中神奇应用

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

零基础入门学用Arduino 第四部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

【调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法】

调试笔记-系列文章目录 调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 文章目录 调试笔记-系列文章目录调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调…

内部类介绍

内部类&#xff08;Inner Class&#xff09;是在另一个类的内部定义的类。它可以访问外部类的所有成员&#xff0c;包括私有成员。内部类有两种主要形式&#xff1a;局部内部类&#xff08;定义在方法内部&#xff09;和成员内部类&#xff08;定义在类的内部&#xff0c;但不在…

echart在线图表demo下载直接运行

echart 全面的数据可视化图表解决方案 | 折线图、柱状图、饼图、散点图、水球图等各类图表展示 持续更新中 三色带下表题速度仪表盘 地图自定义图标 动态环形图饼状图 动态水波动圆形 多标题指针仪表盘 温度仪表盘带下标题 横向柱状图排名 环形饼状图 双折线趋势变化

Git的3个主要区域

一般来说&#xff0c;日常使用只要记住下图6个命令&#xff0c;就可以了。但是熟练使用&#xff0c;恐怕要记住60&#xff5e;100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Reposito…

学会这几点,轻松制作引人入胜的电子期刊

随着数字化时代的到来&#xff0c;电子期刊已经成为了信息传播的重要载体。它以方便快捷、形式多样、互动性强等特点&#xff0c;受到了广泛的欢迎。那么&#xff0c;如何制作一份引人入胜的电子期刊呢&#xff1f;下面就来为大家分享几点制作电子期刊的小技巧。 1.选择合适的制…

制造业为什么需要ERP企业管理软件?

如今&#xff0c;传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下&#xff0c;如果你的企业仍然依赖于手工记录订单、库存和财务数据&#xff0c;那么每当市场发生变动时&#xff0c;你就需要花费大量的时间和精力去重新调整生产计划、更新…

Qt 实战(5)布局管理器 | 5.2、深入解析Qt布局管理器

文章目录 一、深入解析Qt布局管理器1、为什么要使用布局管理器&#xff1f;2、布局管理器类型3、布局管理器用法详解3.1、QBoxLayout&#xff08;垂直与水平布局&#xff09;3.2、QGridLayout&#xff08;网格布局&#xff09;3.3、QFormLayout&#xff08;表单布局&#xff09…

LLM2Vec论文阅读笔记

这是篇LLM论文&#xff0c;用decoder-like的LLM去提取embedding文章认为&#xff0c;decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism&#xff0c;其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

接口联调测试

在我们工作过程中&#xff0c;有时需要一些接口进行联调。接口联调测试&#xff0c;就是按照业务要求&#xff0c;把接口进行组合测试。接口组合起来才能实现完整的业务&#xff0c;体现更大的价值。 接口联调测试业务分析&#xff1a; 原因&#xff1a; 项目中的接口是多个…

【数据结构与算法】最小生成树

文章目录 最小生成树&#xff08;MST&#xff09;定义 构造最小生成树Prim算法Kruskal算法 最小生成树&#xff08;MST&#xff09; 连通图的生成树包含图的所有顶点&#xff0c;并且只含有尽可能少的边。对于生成树来说&#xff0c;若砍去它的一条边&#xff0c;则会使生成树…

DOOPRIME:日本央行7月加息与否取决于数据,购债规模调整无强烈信号

摘要 日本央行行长植田和男近日在议会发言中表示&#xff0c;7月份是否加息将取决于经济数据表现&#xff0c;而购买日本国债与加息是两个独立的问题&#xff0c;不会通过削减购债规模来释放强烈的政策信号。这一表态引发了市场的广泛关注&#xff0c;投资者和经济学家对此进行…

【elementui源码解析】如何实现自动渲染md文档-第四篇

目录 1.前言 2.md-loader - index.js 1&#xff09;md.render() 2&#xff09;定义变量 3&#xff09;while stripTemplate stripScript genInlineComponentText 4&#xff09;pageScript 5&#xff09;return 6&#xff09;demo-block 3.总结 所有章节&#x…

MyBatis逆向工程和MyBatisX插件的使用

文章目录 1.ORM思维2.逆向工程3.MyBatisX插件的使用 1.ORM思维 ORM&#xff08;Object-Relational Mapping&#xff0c;对象-关系映射&#xff09;是一种将数据库和面向对象编程语言中的对象之间进行转换的技术。它将对象和关系数据库的概念进行映射&#xff0c;最后我们就可以…

发生了什么?法国市值蒸发超1.8万亿元

KlipC报道&#xff1a;一周前&#xff0c;法国总统马克龙意外宣布提前举行国会议员选举&#xff0c;引发了法国政坛遭受巨震。仅仅一周内&#xff0c;法国股市遭受重大打击&#xff0c;其市值蒸发了约2580亿美元&#xff08;约1.8万亿人民币&#xff09;。 多家大型金融机构多…

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…