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. [Java]大数运算之加法

    一 题目 Input: String a = "15324564...1455445"; //数字过长,不能转换为int/long型运算 String b = "4564 ...

  2. 开源Apinto网关-流量策略

    背景介绍 Apinto是一款高性能.可扩展.易维护的API网关. Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,企业级开箱即用.Apinto除了提供丰 ...

  3. 0002 嵌入式开发带你从小白到大佬系列之——Linux文件系统、常用文件操作命令(一)及用户权限

    1.熟悉Linux的文件系统结构 Linux的文件系统结构其实是一个树形的分层组织结构,如下图: Linux系统目录结构及目录路径: 1.1.文件系统层次结构标准 Linux是开源的操作系统,各个Li ...

  4. AndroidBanner - ViewPager 03

    AndroidBanner - ViewPager 03 上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题: 当banner不可见的时候,也需要停止 ...

  5. 使用VScode进行Python开发

    一.Microsoft Store中安装:terminal 二.PowerShell中执行: [win10新版或者win11使用: 单个命令安装运行 WSL 所需的一切内容(需要重启计算机):wsl ...

  6. Mysql简明语法

    show databases ; use mybatis; show tables ; select * from user; select * from user where id=1; updat ...

  7. YII文件上传

    <span style="font-size:14px;">use yii\web\UploadedFile; public function actionDoarta ...

  8. 用Abp实现找回密码和密码强制过期策略

    @ 目录 重置密码 找回密码 发送验证码 校验验证码 发送重置密码链接 创建接口 密码强制过期策略 改写接口 Vue网页端开发 重置密码页面 忘记密码控件 密码过期提示 项目地址 用户找回密码,确切地 ...

  9. Redis 报”OutOfDirectMemoryError“(堆外内存溢出)

    Redis 报错"OutOfDirectMemoryError(堆外内存溢出) "问题如下: 一.报错信息: 使用 Redis 的业务接口 ,产生 OutOfDirectMemor ...

  10. 音视频通讯QoS技术及其演进

    利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验. 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的 ...