首页 > 编程语言 >UDP 编程不能太随意

UDP 编程不能太随意

时间:2023-07-05 19:00:53浏览次数:35  
标签:随意 UDP 编程 发送 发送数据 缓冲区 接收 数据

UDP 相比 TCP 虽然是是无连接的,看似发送接收都很随意,但是在发送——接收过程中,仍然有些问题需要重视。在整个通讯过程中至少有两点需要注意,一方面要防止发送方的一厢情愿,另一方面是在允许的条件下,尽量保证数据的完整性

防止发送方的一厢情愿是指在发送时要确保对方有套接字可以接收,不能在另一方没有接收意愿的情况下,浪费时间与精力盲目的发送数据。为了避免一厢情愿的现象发生,我们对 UDP 将要通讯与正在通信的两个阶段分别作出对应的处理。

将要通讯是指还没有发送有效数据的前夕,这个时候我们可以通过先发送一个空的数据包,并使用 select 进行超时等待,然后通过 recvfrom() 接收讯息,如果返回端口不可达或目的不可达的 errno 则直接做相应错误处理,反之,继续程序的运行。

正在通讯发生在将要通讯之后,正在进行有效数据的交互时。在这个阶段如果发生接收方鸟无音讯,处理起来会比较棘手,因为该阶段发送方的行为是同步的,而这种失联是异步发生的。对此有同步与异步两种处理方式,同步方式是指在发送方同步的某个阶段发送空 UDP 消息,用 select 进行超时等待,然后通过 recvfrom() 接收讯息,并对其结果进行对应处理。这样做有一些缺陷,不能及时队错误情况进行处理;异步的方法是通过信号的方法来实现,通过监控相应的信号并注册相应的信号处理函数来对错误情况进行处理。

在可以的条件下,应该尽量保证数据的完整性。虽然 UDP 协议本身就是不对数据质量与完整性负责的协议,但是这种不负责是对于网络状况来说的,这种情况导致的数据不完整是被允许的,除此之外,由于编程者本身对于数据的不规范处理而导致数据的完整性受损应该是被极力避免的。由于编程而引起的数据完整性问题很大程度上是对发送或接收缓冲区的处理不当导致的。

在发送数据时,如果缓冲区满或者缓冲区充足时,前者会返回错误,后者会正常发送,这两者都都不会对数据完整性产生影响,但是如果缓冲区在写入被发送数据的一部分后变为满状态,这时候使用阻塞发送会导致阻塞,如果是非阻塞模式,会直接返回错误造成问题(因为如果重发,我们无法确定数据被发送了多少)。

在接收消息时,如果接收方的数据缓冲区不足以容纳接收到的数据,那么超出缓冲区大小的数据将会被丢弃。这可能会导致数据的丢失,接收方可能无法完全接收发送方发送的数据。因此,在设计应用程序时,需要考虑接收方的数据缓冲区大小,以确保能够完全接收发送方发送的数据。

标签:随意,UDP,编程,发送,发送数据,缓冲区,接收,数据
From: https://www.cnblogs.com/cheng-liu/p/17529567.html

相关文章

  • Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
    https://blog.csdn.net/qq_21438461/article/details/130764349Linux系统编程C/C++以及Qt中的零拷贝技术:从底层原理到高级应用一、零拷贝技术的概念与价值(Zero-CopyConceptandValue)1.1什么是零拷贝(WhatisZero-Copy)1.2为什么我们需要零拷贝(WhyWeNeedZero-C......
  • python基础day38 并发编程
    进程概念进程、线程都是操作系统中的基本概念,也就是说进程和线程都是操作系统层面的东西,专业术语表达就是进程和线程都是由操作系统来调度的,而不是由我们程序员自己来操控的。在操作系统这门课里面,进程和线程是操作系统的概念,协程不是操作系统中的概念,而是我们程序员层面的协程......
  • 【笔试实战】LeetCode题单刷题-编程基础 0 到 1【三】
    682. 棒球比赛题目链接682. 棒球比赛题目描述你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作......
  • python 并发编程
    一、需要了解的概念1、进程和程序的区别程序就是一堆死的东西,没有生命周期进程是有生命周期的,当一个任务进行完毕之后,进程就不存在了2、cpu的工作机制1.当CPU遇到I/O操作的时候,会剥夺CPU的执行权限I/O密集型:inputoutput遇到阻塞,但是不需要占用大量的CPU资源,需要等待,比如:sle......
  • 【Netty】「萌新入门」(四)异步编程模型:利用 Future 和 Promise 提高性能与响应能力
    前言本篇博文是《从0到1学习Netty》中入门系列的第四篇博文,主要内容是介绍Netty中Future与Promise的使用,通过使用异步的方式提高程序的性能和响应速度,往期系列文章请访问博主的Netty专栏,博文中的所有代码全部收集在博主的GitHub仓库中;为什么要使用异步?使用异步编程模式......
  • 西门子S7系列PLC以太网通讯处理器编程调试方法
    捷米特(北京)科技有限公司研发的捷米特以太网通讯模块,转以太网通讯模块型号有ETH-S7200-JM01和ETH-S7300-JM01,适用于西门子S7-200/S7-300/S7-400、SMARTS7-200、西门子数控840D、840DSL、合信、亿维PLC的PPI/MPI/PROFIBUS转以太网。用于西门子S7-200/S7-300/S7-400程序上下载、上位......
  • 曲线艺术编程 coding curves 第十四章 其它曲线(Miscellaneous Curves)
    第十四章其它曲线(MiscellaneousCurves)原作:KeithPetershttps://www.bit-101.com/blog/2022/11/coding-curves/译者:池中物王二狗(sheldon)blog:http://cnblogs.com/willian/源码:github:https://github.com/willian12345/coding-curves曲线艺术编程系列第十四章这是......
  • 【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 编程基础
    如何创建变量——赋值语句变量名=表达式a=b=c=100赋值同一个数字a,b,c=1,2,3赋值多个值数据类型 数字型 a=1  a=2.0print(type(a))字符串 a='hello' strb='1'+'2'+'3' b=123列表a=[1,'two',3.0,'four']元组a=(1,'two',3.0,'......
  • 2023年07月编程语言流行度排名
    点击查看最新编程语言流行度排名(每月更新)2023年07月编程语言流行度排名编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的一门语言教程被搜索的次数越多,大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自谷歌Trends如果您相信集体智慧,那么流行编程......