【QT学习】12.UDP协议,广播,组播

news2024/11/24 11:14:58

一。Udp详细解释

UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。与TCP相比,UDP不提供可靠性、流量控制、拥塞控制和错误恢复等功能,但由于其简单性和低开销,UDP在一些特定的应用场景中得到广泛应用。

UDP的特点如下:

  1. 无连接:UDP在通信之前不需要建立连接,发送方直接将数据报发送给接收方。
  2. 不可靠:UDP不保证数据报的可靠传输,数据报可能会丢失、重复或乱序。
  3. 高效:由于不需要建立连接和维护状态信息,UDP的开销较小,传输效率较高。
  4. 面向报文:UDP将应用层交给它的数据报作为一个整体进行处理,不会对数据进行拆分和合并。

UDP适用于以下场景:

  1. 实时性要求高:由于UDP不需要建立连接和维护状态信息,可以更快地传输数据,适用于实时性要求较高的应用,如音视频传输、实时游戏等。
  2. 数据量小、频繁:由于UDP不提供流量控制和拥塞控制等机制,适用于数据量小、频繁发送的场景,如DNS查询、SNMP等。
  3. 可靠性由应用层保证:在某些应用中,可靠性要求由应用层自身保证,如实时语音通信中的重传机制。

2.如何写Udp的代码(qt中)

        UDP是一种半双工通信协议,这意味着它在同一时间只能进行发送或接收操作,而不能同时进行发送和接收。当一个主机使用UDP发送数据时,它不能立即接收来自同一主机的响应数据。相反,它必须等待发送完成后才能接收数据。

        因此,UDP不支持全双工通信,而是通过交替的发送和接收操作来实现数据传输。全双工通信需要使用其他协议,如TCP,它提供了可靠的、面向连接的双向数据传输。

二。实例:使用QT写Udp代码

结果:

        相互通信正常,服务器中对方端口是通过观察:收来的数据来判断对方port

服务器端

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("服务器端,port:8888");

    //创建socket
    pUdpSocket=new QUdpSocket(this);
    //绑定服务器端的端口
    pUdpSocket->bind(8888);
    //设置  组播 进组  《组播使用》
    //pUdpSocket->bind(QHostAddress::AnyIPv4,8888);
    //pUdpSocket->joinMulticastGroup(QHostAddress("224.0.0.3"));

    //收数据
    connect(pUdpSocket,&QUdpSocket::readyRead,
            [=](){
        char buff[1024] = {0};  //为读数据做准备
        QHostAddress ip;        //为读数据做准备
        quint16 port;           //为读数据做准备
        pUdpSocket->readDatagram(buff,1023,&ip,&port);//读数据

        QString str = QString("ip:%1,port:%2,msg:%3").arg(ip.toString()).arg(port).arg(buff);
        ui->textEditRECV->append(str);
    });
}

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


void Widget::on_pushButtonCLOSE_clicked()
{

}

void Widget::on_pushButtonSEND_clicked()
{
    QString ip=ui->lineEditIP->text();
    QString port=ui->lineEditPORT->text();
    QString msg=ui->textEditSEND->toPlainText();
    pUdpSocket->writeDatagram(msg.toUtf8(),QHostAddress(ip),port.toUInt());
    /*
writeDatagram(      函数名
msg.toUtf8()        textEditSEND内容改为UTF-8类型,这样展示正确
QHostAddress(ip)    ip强制转换为QHostAddress
port.toUInt()       port强制转换为int
);
*/
}

客户端

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    this->setWindowTitle("客户端");
    //创建对象
    pUdpSocket=new QUdpSocket(this);
    //收数据-->与服务器端处理一模一样,代码都一样
    connect(pUdpSocket,&QUdpSocket::readyRead,
            [=](){
        char buff[1024] = {0};  //为读数据做准备
        QHostAddress ip;        //为读数据做准备
        quint16 port;           //为读数据做准备
        pUdpSocket->readDatagram(buff,1023,&ip,&port);//读数据

        QString str = QString("ip:%1,port:%2,msg:%3").arg(ip.toString()).arg(port).arg(buff);
        ui->textEditRECV->append(str);
    });
}

Form::~Form()
{
    delete ui;
}
//与服务器代码一样
void Form::on_pushButtonSEND_clicked()
{
    QString ip=ui->lineEditIP->text();
    QString port=ui->lineEditPORT->text();
    QString msg=ui->textEditSEND->toPlainText();
    pUdpSocket->writeDatagram(msg.toUtf8(),QHostAddress(ip),port.toUInt());
}

void Form::on_pushButtonCLOSE_clicked()
{

}

三。广播

四。组播

D类地址
        组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

        224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;

        224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;

        224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;

        239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

综上:我们使用224.0.0.0~224.0.0.255(永久组地址)。

代码:

1.使用组播时,需要进组

    //4 设置组播  进组
pUdpSocket->bind(QHostAddress::AnyIPv4,8888);//绑定组播端口
pUdpSocket->joinMulticastGroup(QHostAddress("224.0.0.3"));//进入组播IP
    //这是出组
//pUdpSocket->leaveMulticastGroup(QHostAddress("224.0.0.3"));

        只有服务器端进组,客户端没有进组,但是出现了问题,组播发送不了数据(没有接收到数据)。

但是资料可以

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

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

相关文章

for循环赋值

在for循环内将i赋值给j的问题 for(int i0,ji1;i<5;i){//此时j只会等于1cout<<"i-"<<i<<" j-"<<j<<endl; }如图&#xff1a; 将j放入循环体后没问题 for(int i0;i<5;i){int j i1; cout<<"i-"<<…

leetcode84柱状图中最大的矩形

题解&#xff1a; - 力扣&#xff08;LeetCode&#xff09; class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack new Stack<>();int maxArea Integer.MIN_VALUE;for(int i 0;i < heights.length;i){int curHeight hei…

|Python新手小白中级教程|第二十三章:列表拓展之——元组

文章目录 前言一、列表复习1.索引、切片2.列表操作字符3.数据结构实践——字典 二、探索元组1.使用索引、切片2.使用__add__((添加元素&#xff0c;添加元素))3.输出元组4.使用转化法删除元组指定元素5.for循环遍历元组 三、元组VS列表1.区别2.元组&#xff08;tuple&#xff0…

【书生·浦语大模型实战营第二期】Lagent AgentLego 智能体应用搭建——学习笔记6

文章目录 概述Lagent: 轻量级智能体框架Lagent Web Demo用Lagent自定义工具 AgentLego&#xff1a;组装智能体“乐高”直接使用AgentLego作为智能体工具使用AgentLego用AgentLego自定义工具 参考资料 概述 Lagent是什么 一个轻量级开源智能体框架&#xff0c;提供了一些典型工…

(ARM)ORACLE JDK 22 的下载安装及环境变量的配置

目录 获取JDK 安装JDK 配置JAVA环境变量 其他补充&#xff1a;JDK 22的新特征 1. 语法 2. 库 3. 性能 4. 工具 在今年的3月份&#xff0c;ORACLE 更新了的JDK 发行版 JDK 22&#xff0c;作为了一位ORACLE Primavera系列产品的研究者&#xff0c;其实对JDK的迭代完全不感…

Qt QImageReader类介绍

1.简介 QImageReader 是用于读取图像文件的类。它提供了读取不同图像格式的功能&#xff0c;包括但不限于 PNG、JPEG、BMP 等。QImageReader 可以用于文件&#xff0c;也可以用于任何 QIODevice&#xff0c;如 QByteArray &#xff0c;这使得它非常灵活。 QImageReader 是一个…

不坑盒子激活码免费领取

不坑盒子的一些新出来的大功能&#xff0c;都需要账号有Pro权限才能使用了。 关键是这些功能还很强大呢&#xff01;不用还不行&#xff01; 今天发现一个可以免费领不坑盒子Pro激活码的方法&#xff1a; 扫码进去后&#xff0c;就能看到激活码了&#xff1a; 复制激活码&…

Java | Leetcode Java题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n obstacleGrid.length, m obstacleGrid[0].length;int[] f new int[m];f[0] obstacleGrid[0][0] 0 ? 1 : 0;for (int i 0; i < n; i) {for (i…

Deep Learning Part Five RNNLM的学习和评价-24.4.30

准备好RNNLM所需要的层&#xff0c;我们现在来实现RNNLM&#xff0c;并对其进行训练&#xff0c;然后再评价一下它的结果的。 5.5.1 RNNLM的实现 这里我们将RNNLM使用的网络实现为SimpleRnnlm类&#xff0c;其层结构如下&#xff1a; 如图 5-30 所示&#xff0c;SimpleRnnlm …

Docker构建LNMP部署WordPress

前言 使用容器化技术如 Docker 可以极大地简化应用程序的部署和管理过程&#xff0c;本文将介绍如何利用 Docker 构建 LNMP 环境&#xff0c;并通过部署 WordPress 来展示这一过程。 目录 一、环境准备 1. 项目需求 2. 安装包下载 3. 服务器环境 4. 规划工作目录 5. 创…

无言:破局之道:顿悟+坚持——早读(逆天打工人爬取热门微信文章解读)

致无言 引言Python 代码第一篇 洞见 7年跟踪调查北京28个精英家庭&#xff1a;为什么顶尖大学孩子大多来自有钱家庭&#xff1f;第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 控制你的情绪 否则它将控制你 在紧张的游戏中 控制情绪 避免冲动行为 是每个玩家的…

Redis 实战1

SDS Redis 只会使用 C 字符串作为字面量&#xff0c; 在大多数情况下&#xff0c; Redis 使用 SDS &#xff08;Simple Dynamic String&#xff0c;简单动态字符串&#xff09;作为字符串表示。 比起 C 字符串&#xff0c; SDS 具有以下优点&#xff1a; 常数复杂度获取字符串…

设计模式之模板模式TemplatePattern(五)

一、模板模式介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式&#xff08;Template Pattern&#xff09;&#xff0c; 在一个抽象类公开定义了执行它的方法的模板。它的子类可以更需要重写方法实现&#xff0c;但可以成为典型类中…

基于Springboot的校园食堂订餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园食堂订餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程&#xff0c;本文前面将在在线环境中安装用到的各种所需验证软件&#xff0c;而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

前端工程化03-贝壳找房项目案例JavaScript常用的js库

4、项目实战&#xff08;贝壳找房&#xff09; 这个项目包含&#xff0c;基本的ajax请求调用,内容的渲染&#xff0c;防抖节流的基本使用&#xff0c;ajax请求工具类的封装 4.1、项目的接口文档 下述接口文档&#xff1a; 简述内容baseURL&#xff1a;http://123.207.32.32…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

excel怎么删除条件格式规则但保留格式?

这个问题的意思就是要将设置的条件格式&#xff0c;转换成单元格格式。除了使用VBA代码将格式转换外&#xff0c;还可以用excel自己的功能来完成这个任务。 一、将条件格式“留下来” 1.设置条件格式 选中数据&#xff0c;点击开始选项卡&#xff0c;设置条件格式&#xff0…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…