Qt扫盲- QUdpSocket 类理论总结

news2024/9/22 9:27:23

QUdpSocket 类理论总结

  • 一、概述
  • 二、使用流程
  • 三、QNetworkDatagram 简述

一、概述

UDP (User Datagram Protocol)是一种轻量级的、不可靠的、面向数据报的、无连接的协议。当可靠性不重要时,可以使用它。QUdpSocket是QAbstractSocket的子类,允许发送和接收UDP数据报。

经典的UDP编程流程
在这里插入图片描述

二、使用流程

使用这个类最常见的方式是使用 bind() 绑定一个地址和端口,然后调用 writeDatagram() 和 readDatagram() / receiveDatagram() 来传输数据。如果想使用标准的QIODevice函数read()、readLine()、write()等,必须首先通过调用connectToHost()将套接字直接连接到另一端。

每当向网络写入数据报时,套接字就发出 bytesWritten() 信号。如果你只是想发送数据报,不需要调用bind()。
每当数据报到达时,就会触发readyRead()信号。在这种情况下,haspendingdatagram()返回true。调用pendingDatagramSize()获取待处理的第一个数据报的大小,再调用readDatagram()或receiveDatagram()读取它。

注意:当收到readyRead()信号时,应该读取传入的数据报,否则将不会为下一个数据报发出此信号。

  void Server::initSocket()
  {
      udpSocket = new QUdpSocket(this);
      udpSocket->bind(QHostAddress::LocalHost, 7755);

      connect(udpSocket, &QUdpSocket::readyRead,
              this, &Server::readPendingDatagrams);
  }

  void Server::readPendingDatagrams()
  {
      while (udpSocket->hasPendingDatagrams()) {
          QNetworkDatagram datagram = udpSocket->receiveDatagram();
          processTheDatagram(datagram);
      }
  }

QUdpSocket也支持UDP组播。使用 joinMulticastGroup() 和 leaveMulticastGroup() 来控制组成员关系,并使用 QAbstractSocket::MulticastTtlOption 和 QAbstractSocket::MulticastLoopbackOption 来设置TTL和环回套接字选项。使用 setMulticastInterface() 来控制组播数据报的出接口,使用 multicastInterface() 来查询出接口。
使用 QUdpSocket,您还可以使用 connectToHost() 建立到UDP服务器的虚拟连接,然后使用 read() 和 write() 交换数据报,而无需指定每个数据报的接收方。

三、QNetworkDatagram 简述

QNetworkDatagram可与QUdpSocket类一起使用,表示UDP (User Datagram Protocol,用户数据报协议)数据报中包含的完整信息。QNetworkDatagram封装了一个数据报的下列信息:

  • 有效载荷数据;
  • 发件人地址及端口号;
  • 目的地址和端口号;
  • 剩余跳数限制(在IPv4上,该字段通常称为time to live - TTL);
  • 接收或发送数据报的网络接口索引。

QUdpSocket将尝试在所有操作系统上尽可能匹配通用行为,但在某些操作系统中并不能获得上述所有元数据。使用 QUdpSocket::writeDatagram() 发送时不能在数据报上设置的元数据将被静默丢弃。

接收到数据后,senderAddress() 和 senderPort() 属性中包含发送数据报的那一端的地址和端口,而 destinationAddress() 和 destinationPort() 属性中包含数据报中的目标地址。这通常是当前机器的本地地址,但也可以是IPv4广播地址(例如“255.255.255.255”)或IPv4或IPv6组播地址。应用程序可能会发现,确定数据报是通过单播寻址专门发送到本机的,还是发送到多个目的地的,是很有用的。

发送时,senderAddress() 和 senderPort() 应该包含发送时使用的本地地址。发送地址必须是分配给这台机器的地址,可以通过 QNetworkInterface 获得,端口号必须是套接字绑定的端口号。任何一个字段都可以不设置,由操作系统用默认值填充。destinationAddress() 和 destinationPort() 字段可以设置为与UDP套接字当前关联的目标地址不同的目标地址。
通常,在发送数据报以响应之前收到的数据报时,会将 destinationAddress() 设置为传入数据报的 senderAddress() ,端口号也是类似的。为了简化这一常见过程,QNetworkDatagram提供了 makeReply() 函数。

对于接收到的数据报,hopCount()函数包含了该数据包剩余的跳数限制。发送时,包含要设置的跳数限制。大多数协议将这个值设置为默认值,并由操作系统决定使用的最佳值。IPv4上的多播通常使用这个字段来表示多播组的范围(link-local, local to a organization or global)。

interfaceIndex()函数包含了操作系统接收到数据包的接口的索引。这个值与可以在QHostAddress::scopeId()属性上设置的值相同,并且与QNetworkInterface::index()属性匹配。在向全局地址发送报文时,不需要设置接口索引,操作系统会根据系统路由表选择正确的接口索引。在将数据报发送到链路本地目的地(无论是单播还是多播)时,这个属性很重要。
功能的支持

并非所有操作系统都支持QNetworkDatagram的某些特性。所有系统只支持远程主机的地址和端口(接收数据包的发送端和发送数据包的目的地)。在大多数操作系统上,其他特性仅支持IPv6。软件应该在运行时检查是否可以确定IPv4地址的其余部分。

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

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

相关文章

SpringBoot+Vue--token,vue导航守卫,axios拦截器-笔记3

自己学习记录,写的不详细,没有误导,不想误导 大概的登录逻辑,前后端完整实现: 1.用户名,密码验证成功后,后端签发token返回给前端 2.前端把token保存到本地存储 3.每次请求前,通过axios请求拦截器,统一发送token 4.通过Vue导航守卫,和axios响应拦截器,统一保护页面 新建个…

【华为上机真题 2023】事件推送

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

机制设计原理与应用(四)预算可行的拍卖机制

文章目录4 预算可行的拍卖机制4.1 特征4.2 使用案例4.3 拍卖设计问题4.4 单调次模函数(Monotone Submodular Function)4.4.1 分配算法4.4.2 关键支付计划4.4.3 特性4.5 在线预算可行的拍卖机制4.5.1 Secretary Problem(A Optimal Stopping Problem)4.5.2…

如何与他人交流-第5期

上期我们讲了打破预期,顺应主体这期我们来讲讲如何建立亲和关系(关系侧)我的别人交流,只有在不把别人当成对象(工具人),而是把对方当成主体的情况下(让别人感受到尊重),这是相互尊重的终极本质,也是唯一方法.把别人当人看.认同对方,对方也会认同你.自信从何而来自信本意为相信自…

信息论复习—连续信源、信道及容量

目录 连续信源的熵: 连续信源离散化后的概率空间: 连续信源离散化后的熵: 连续信源的绝对熵: 连续信源的相对熵: 连续信源的条件熵: 连续信源的相对条件熵: 连续信源相对熵的最大化&#…

李宏毅ML-卷积神经网络CNN

李宏毅ML-卷积神经网络CNN 文章目录李宏毅ML-卷积神经网络CNNImage ClassificationConvolutional Layer1. Neural Version StoryReceptive FieldParameter Sharing2. Filter Version StoryFilterParameter Sharing3. Summary of Two VersionsPooling LayerThe Whole CNNDrawbac…

Hyperbolic geometry (双曲几何简介)

ContentsManifolds: A Gentle IntroductionManifoldsTangent SpacesMetric TensorRiemannian Manifolds (黎曼流形)Hyperbolic Geometry and Poincar EmbeddingsCurvature (曲率)Euclidean and Non-Euclidean GeometriesHyperbolic SpaceMinkowski SpaceHyperboloid (双曲面)Th…

树和森林(快来瞧)

森林的定义 森林是由多颗互不相交的树所构成的树的集合,即森林包含多棵树,每一棵树都有自己的根结点。一棵树也可以看成森林。 树的表示及基本操作 1.树(一般树)的表示方法 1.1树的双亲表示法 树的双亲表示法是将树的各个节点…

现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN工业联测

在去年,因为众所周知的因素影响,项目的甲方主动提出延缓设备的交付。作为乙方,尽管项目延缓是甲方提出的,但依旧希望按期交付,这样才能回款,熬过一年。其实,2022年初,几类传感器、压…

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解 1. TIA博途一侧的配置: 当我们安装好RobotStudio软件后,可以在以下的目录中C:\ProgramData\ABB Industrial IT\Robotics IT\DistributionPackages\ABB.RobotWare-6.08.0134\RobotPackages\RobotWare_RPK_6.08.013…

【JavaWeb】JavaScript基础语法(上)

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaWeb】 ✈️✈️本篇内容:JavaScript基础语法(上)! 🚀🚀代码托管平台github:JavaWeb代码存放仓库&#xff01…

ESP32设备驱动-TSL2561亮度传感器驱动

TSL2561亮度传感器驱动 1、TSL2561介绍 TSL2560 和 TSL2561 是第二代环境光传感器器件。每个都包含两个集成模数转换器 (ADC),用于集成来自两个光电二极管的电流。两个通道的整合同时发生。转换周期完成后,转换结果分别传送到通道 0 和通道 1 数据寄存器。传输是双缓冲的,…

【头歌】单链表的基本操作

单链表的基本操作第1关:单链表的插入操作任务描述本关任务:编写单链表的初始化、插入、遍历三个操作函数。相关知识链表是线性表的链式存储结构的别称,特点是以“指针”指示后继元素,因此线性表的元素可以存储在存储器中任意一组存…

Linux常用命令——speedtest-cli命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) speedtest-cli 命令行下测试服务器外网速度 补充说明 speedtest-cli是一个使用python编写的命令行脚本,通过调用speedtest.net测试上下行的接口来完成速度测试,最后我会测试运维生存时间…

YOLOV3 Pytorch版本代码解读

YOLOV3 Pytorch版本代码解读 代码与coco数据集关注wx公众号JokerTong回复yolov3即可获取 参考视频 YOLO系列算法 文章目录YOLOV3 Pytorch版本代码解读数据集准备与关键文件说明前提准备代码大致流程需要自行修改代码的部分项目代码解读一 数据与标签的读取二 模型构造convoluti…

数据库工具类的编写

package com.bjpowernode.jdbc.utils;import java.sql.*; import java.util.ResourceBundle;/*** 数据库工具类简化JDBC的代码编写。** 在同一个没有结束的程序中,DBUtil类只加载一次,加载一次以后,再次调用该类中的方法,本不会再…

基于Echarts构建大数据招聘岗位数据可视化大屏

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

SpringBoot 3.0.x使用SpringDoc

为什么使用SpringDoc 在Springfox3.0停更的两年里,SpringBoot进入3.0时代, SpringFox出现越来越多的问题,最为明显的就是解析器的问题,已经在上文 中解释清楚,这里就不再赘述。 SpringDoc是Spring官方推荐的API&#x…

Spring笔记上(基于注解开发)

一、第三方资源配置管理 以DataSource连接池对象为例,进行第三方资源配置管理。 1. 管理DataSource连接池对象 spring整合Druid、C3P0数据库连接池 1.1 管理Druid连接池 1、准备数据 create database if not exists spring_db character set utf8; use spring_db; …

二、python基础语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频:https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 一 、print 1. end 2. \t对齐 二、字面量 1. 字面量的含义 2. 常见的字面量类型 3. 如何基于print语句完成各类字面量的输出 三、 注释的分类 1. 单行注释 2. 多行注释 3. 注释的…