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

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

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

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

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

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

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

UDP 编程不能太随意的更多相关文章

  1. [C# 网络编程系列]专题六:UDP编程

    转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当 ...

  2. 转:【专题六】UDP编程

    引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...

  3. 专题六:UDP编程

    引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...

  4. Linux学习四:UDP编程(上)

    关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些 ...

  5. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

    转自:http://www.cnblogs.com/zhili/archive/2012/09/03/2666974.html 上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享 ...

  6. Socket编程实践(12) --UDP编程基础

    UDP特点 无连接,面向数据报(基于消息,不会粘包)的传输数据服务; 不可靠(可能会丢包, 乱序, 反复), 但因此普通情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #inclu ...

  7. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

  8. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  9. Twisted UDP编程技术

    实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...

  10. 五十六、linux 编程——UDP 编程模型

    56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...

随机推荐

  1. 多态、抽象、Object类

    1.方法重写要求:方法名相同.参数类型相同.返回值相同或其子类返回值相同,子类修饰符要不小于父类 2.方法重载要求:方法名相同.参数类型不同.返回值没有改变.修饰符无关 3.多态的前提是继承.多态是定 ...

  2. .NET CORE 部署到IIS上,HTTP 错误 500.19 - Internal Server Error

    经排查,是因为项目中web.config的rewrite节点不支持,注释掉此节点即可,或者尝试下载相关依赖以支持此节点

  3. msp430点灯实验

    title: msp430点灯实验 date: 2023-04-15 15:31:25 description: 基于msp430f5529点灯实验 一.实验内容 使用开发板:msp430f5529 ...

  4. 【总结】从++i思考计算机原子性和线程安全

    在C++中,++i被认为是一种原子性操作,即不可分割的.不可中断的整体.它能够确保对变量的修改完整且正确,从而避免了数据竞争等问题,提高了程序的并发性和可靠性.然而,有些人可能会将原子性和线程安全混淆 ...

  5. API 扫盲贴,8分钟快速搞懂 API 框架

    API(应用程序编程接口)是一种传递信息和指令的工具,它通过不同的功能和协议等手段,允许不同的软件或系统之间进行通信和交互.作为程序员或开发人员,API 是你日常工作中必不可少的组成部分.在本文中,我 ...

  6. cryptohack wp day (2)

    接着昨天的题目 第五题 看题目,一道简单的xor题,就是将"label中每个字符与13进行异或处理",直接上代码: s="label" result = &qu ...

  7. boot-admin开源项目中有关后端参数校验的最佳实践

    我们在项目开发中,经常会对一些参数进行校验,比如非空校验.长度校验,以及定制的业务校验规则等,如果使用if/else语句来对请求的每一个参数一一校验,就会出现大量与业务逻辑无关的代码,繁重不堪且繁琐的 ...

  8. 用tk.mybaits实现指定字段更新

    ​ 去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...

  9. 2023-03-23:音视频解混合(demuxer)为PCM和YUV420P,用go语言编写。

    2023-03-23:音视频解混合(demuxer)为PCM和YUV420P,用go语言编写. 答案2023-03-23: 大体步骤如下: 1.打开媒体文件,并获取音频和视频流. 2.对于每个流,找到 ...

  10. 2020-08-25:BloomFilter的原理以及Zset的实现原理。

    福哥答案2020-08-25: 布隆过滤器:哈希+位图.布隆过滤器重要的三个公式1.假设数据量为n,预期的失误率为p(布隆过滤器大小和每个样本的大小无关).2.根据n和p,算出BloomFilter一 ...