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

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

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

但是资料可以

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

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

相关文章

Java | Leetcode Java题解之第64题最小路径和

题目: 题解: class Solution {public int minPathSum(int[][] grid) {if (grid null || grid.length 0 || grid[0].length 0) {return 0;}int rows grid.length, columns grid[0].length;int[][] dp new int[rows][columns];dp[0][0] grid[0][0]…

《罪与罚》读后感

陀思妥耶夫斯基和列夫托尔斯泰是公认的俄国文学黄金时代的两座高峰,分别代表着俄国文学的“深度”和“广度”。列夫托尔斯泰的鸿篇巨著《复活》《安娜卡列尼娜》等等都已经拜读过,但陀思妥耶夫斯基的作品却一本也没有看过,实在是有点遗憾。这…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下,确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术,具有灵活状态切换功能的智能仿真三相电能表,旨在通过技术创新提高电能计量人员的培训…

Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了

Flutter笔记 谈Material状态属性-为什么FlatButton等旧版按钮就废弃了 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this artic…

MySQL-逻辑架构

1、MySQL服务器处理客户端请求 MySQL是典型的C/S架构,服务端程序使用 mysqld。实现效果:客户端进程像服务端发送(SQL语句),服务器进程处理后再像客户端进程发送 处理结果。 2、connectors 指不同语言中与SQL的交互…

Vue3+ts(day05:ref、props、生命周期、hook)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

OpenMLDB v0.9.0 发布:SQL 能力大升级覆盖特征上线全流程

发布日期 25 April 2024 Release note https://github.com/4paradigm/OpenMLDB/releases/tag/v0.9.0 亮点特性 增加最新版 SQLAlchemy 2 的支持,无缝集成 Pandas 和 Numpy 等常用 Python 框架。支持更多数据后端,融合 TiDB 的分布式文件存储能力以及…

【Redis】Redis安装、配置、卸载使用可视化工具连接Redis

文章目录 1.前置条件2.安装Redis2.1下载Redis安装包并解压2.2在redis目录下执行make命令2.3修改Redis配置文件2.4启动Redis服务2.5连接redis服务 3.Redis卸载4.使用可视化工具连接Redis 1.前置条件 Linux操作系统需要要是64位.如果不清楚自己Linux上是多少位的,可以使用以下命…

详解 Go 程序的启动流程,你知道 g0,m0 是什么吗?

自古应用程序均从 Hello World 开始,你我所写的 Go 语言亦然: import "fmt"func main() {fmt.Println("hello world.") }这段程序的输出结果为 hello world.,就是这么的简单又直接。但这时候又不禁思考了起来&#xff0…

vue3 ——笔记 (表单输入,监听器)

表单输入 在Vue 3中,v-model指令的用法稍有不同于Vue 2。在Vue 3中,v-model指令实际上是一个语法糖,它会自动将value属性和input事件绑定到组件或元素上,以实现双向数据绑定。 在自定义组件中使用v-model时,需要在组…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作,今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作,有助于更好理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

Codeforces Round 943 (Div. 3) (A-G1) C++题解

目录 比赛链接 : A. Maximize? B. Prefiquence C. Assembly via Remainders D. Permutation Game E. Cells Arrangement F. Equal XOR Segments G1. Division LCP (easy version) G2. Division LCP (hard version) 比赛链接 : Dashboard - Codeforces Round 943 (…

用vim或gvim编辑程序

vim其实不难使用&#xff0c;学习一下就好了。简单功能很快学会。它有三种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;视模式。打开时在命令模式。在命令模式下按 i 进入编辑模式&#xff0c;在编辑模式下按<Esc>键退出编辑模式。在命令模式按 :wq 保存文…

Python-100-Days: Day08 Object-oriented programming(OOP) basics

OOP definition 把一组数据结构和处理它们的方法组成对象&#xff08;object&#xff09;&#xff0c;把相同行为的对象归纳为类&#xff08;class&#xff09;&#xff0c;通过类的封装&#xff08;encapsulation&#xff09;隐藏内部细节&#xff0c;通过继承&#xff08;in…

C/C++开发环境配置

配置C/C开发环境 1.下载和配置MinGW-w64 编译器套件 下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载后解压并放至你容易管理的路径下&#xff08;我是将其放在了D盘的一个software的文件中管理&#xff09; 2.…

古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…

QT5带UI的常用控件

目录 新建工程&#xff0c;Qmainwindow带UI UI设计器 常用控件区 Buttons 按钮 containers 容器 控件属性区域 对象监视区 布局工具区 信号与槽区 简单例子1 放置一个按钮控件&#xff0c;改文本为发送&#xff0c;该按键为Button1&#xff1b; 按钮关联信号和…

点云三角化---------PCL

贪婪三角化 pcl::PolygonMesh PclTool::projectionTriangulation(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {// 正态估计pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n; // 法线估计对象pcl::PointCloud<pcl::N…

刷代码随想录有感(53):合并二叉树

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//前序好理解&#xff0c;直接将树覆盖到另一个上面if(root1 NULL)return root2;//当前遍历节点为空的话就让另一个的值覆盖过来if(root2 NUL…