UDP 编程不能太随意
UDP 相比 TCP 虽然是是无连接的,看似发送接收都很随意,但是在发送——接收过程中,仍然有些问题需要重视。在整个通讯过程中至少有两点需要注意,一方面要防止发送方的一厢情愿,另一方面是在允许的条件下,尽量保证数据的完整性。
防止发送方的一厢情愿是指在发送时要确保对方有套接字可以接收,不能在另一方没有接收意愿的情况下,浪费时间与精力盲目的发送数据。为了避免一厢情愿的现象发生,我们对 UDP 将要通讯与正在通信的两个阶段分别作出对应的处理。
将要通讯是指还没有发送有效数据的前夕,这个时候我们可以通过先发送一个空的数据包,并使用 select 进行超时等待,然后通过 recvfrom() 接收讯息,如果返回端口不可达或目的不可达的 errno 则直接做相应错误处理,反之,继续程序的运行。
正在通讯发生在将要通讯之后,正在进行有效数据的交互时。在这个阶段如果发生接收方鸟无音讯,处理起来会比较棘手,因为该阶段发送方的行为是同步的,而这种失联是异步发生的。对此有同步与异步两种处理方式,同步方式是指在发送方同步的某个阶段发送空 UDP 消息,用 select 进行超时等待,然后通过 recvfrom() 接收讯息,并对其结果进行对应处理。这样做有一些缺陷,不能及时队错误情况进行处理;异步的方法是通过信号的方法来实现,通过监控相应的信号并注册相应的信号处理函数来对错误情况进行处理。
在可以的条件下,应该尽量保证数据的完整性。虽然 UDP 协议本身就是不对数据质量与完整性负责的协议,但是这种不负责是对于网络状况来说的,这种情况导致的数据不完整是被允许的,除此之外,由于编程者本身对于数据的不规范处理而导致数据的完整性受损应该是被极力避免的。由于编程而引起的数据完整性问题很大程度上是对发送或接收缓冲区的处理不当导致的。
在发送数据时,如果缓冲区满或者缓冲区充足时,前者会返回错误,后者会正常发送,这两者都都不会对数据完整性产生影响,但是如果缓冲区在写入被发送数据的一部分后变为满状态,这时候使用阻塞发送会导致阻塞,如果是非阻塞模式,会直接返回错误造成问题(因为如果重发,我们无法确定数据被发送了多少)。
在接收消息时,如果接收方的数据缓冲区不足以容纳接收到的数据,那么超出缓冲区大小的数据将会被丢弃。这可能会导致数据的丢失,接收方可能无法完全接收发送方发送的数据。因此,在设计应用程序时,需要考虑接收方的数据缓冲区大小,以确保能够完全接收发送方发送的数据。
UDP 编程不能太随意的更多相关文章
- [C# 网络编程系列]专题六:UDP编程
转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当 ...
- 转:【专题六】UDP编程
引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...
- 专题六:UDP编程
引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...
- Linux学习四:UDP编程(上)
关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些 ...
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
转自:http://www.cnblogs.com/zhili/archive/2012/09/03/2666974.html 上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享 ...
- Socket编程实践(12) --UDP编程基础
UDP特点 无连接,面向数据报(基于消息,不会粘包)的传输数据服务; 不可靠(可能会丢包, 乱序, 反复), 但因此普通情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #inclu ...
- 【Socket编程】通过Socket实现UDP编程
通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- Twisted UDP编程技术
实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...
- 五十六、linux 编程——UDP 编程模型
56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...
随机推荐
- 机器学习(四):4层BP神经网络(只用numpy不调包)用于训练鸢尾花数据集|准确率96%
题目: 设计四层BP网络,以g(x)=sigmoid(x)为激活函数, 神经网络结构为:[4,10,6, 3],其中,输入层为4个节点,第一个隐含层神经元个数为10个节点:第二个隐含层神经元个数为6个 ...
- Deep-DRM算法理解
title: GCN学习笔记 categories: - 生物信息学 date: 2023-03.13 hidden: true mathjax: true GCN GCN(Graph Convolu ...
- React Native组件(二)
一.创建一个项目 1.1.找到目标目录cmd命令,请尽量不要有中文路径 npx react-native init reactnative03 进入文件 cd reactnative03 启动 npx ...
- C语言中,取反运算符~a=-(a+1)的原因
1.因为计算机直接拿读取到的数据去运算付出的代价是最小的,所以计算机存储的数据的形式应该满足读取后不必经过任何加工就能直接用来运算由于原码不经加工无法实现(+a)+(-a)=0,所以不满足该要求,为了 ...
- APISIX Ingress 如何使用 Cert Manager 管理证书
Apache APISIX Ingress Controller 是一款以 Apache APISIX 作为数据面的 Kubernetes Ingress Controller 开源工具,目前已经更新 ...
- 文件上传漏洞靶场:upload-labs(附在线地址)
重装系统:CentOS 7.6 密钥对验证,或密码验证,根据自身情况选择,博主这边为了ssh连接方便选用的密码校验. WindTerm登录系统 需提前去云服务器的安全组,开放22端口ssh连接. 更新 ...
- Redis之消息队列实现
文章目录 秒杀场景 采用消息队列实现 List实现消息队列 PubSub(发布订阅)实现消息队列 基于Stream实现消息队列 消费者组 实践 总结 秒杀问题是非常重要且比较难实现的,如果不进行架构的 ...
- 探讨AIGC的崛起历程,浅析其背后技术发展
摘要:本文主要讨论了AIGC(人工智能生成内容)的发展历程.现状.应用,浅析其背后技术发展.与华为云的联系,以及面临的挑战和展望. 本文分享自华为云社区<AIGC:人工智能生成内容的崛起与未来展 ...
- 2022-06-21:golang选择题,以下golang代码输出什么?A:3;B:4;C:100;D:编译失败。 package main import ( “fmt“ ) func
2022-06-21:golang选择题,以下golang代码输出什么?A:3:B:4:C:100:D:编译失败. package main import ( "fmt" ) fu ...
- 2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例。
2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例. 答案2022-04-04: 1.建造者模式.resource.Builder.D:\go_path\src\git ...