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. 一文吃透Elasticsearch

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  2. 我的OpenAI库发布了!!!

    chatGPT正式发布已经有段时间了,这段时间我也深度体验了chatGPT的魅力. OpenAI除了提供网页版的chatGPT,还通过api的形式提供了很多其它服务,包括文字纠错.图片生成.音频转换等 ...

  3. 为什么数据库project被做成了web开发啊啊——一个半小时实现增删查改

    昨天晚上去小破站上找了一点点~~亿点点~~资料,仔细研究了一下我们项目说明文档里的restful框架,发现可以直接用django_restful_framework. 天大的好消息啊!今天下午有三个小 ...

  4. AndroidApp加密数据明文抓取测试方法——hook方式

    0x00 前言 在做移动安全的app渗透或者说移动app的漏洞挖掘时,往往会碰到一种情况:好不容易绕过了app的反抓包机制,通过burp抓到了app传输的数据包,这时想对这部分数据做一些爆破.篡改之类 ...

  5. CefSharp自定义缓存实现

    大家好,我是沙漠尽头的狼. 上文介绍了<C#使用CefSharp内嵌网页-并给出C#与JS的交互示例>,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处: 提高页面加载加速:Ce ...

  6. HTML中script 标签中的那些属性

    在HTML中, <script> 标签用于嵌入或引用JavaScript代码. 在 <script> 标签中,有两个属性可以用来控制脚本的加载和执行方式: async 和 de ...

  7. count(列名)、count(1)和 count(*)有什么区别?

    在MySQL中,这几个都是统计操作,很多人在使用的时候,都使用的是count(1),这有没有问题?使用正确?达到了统计效果? 我们从效果和效率两方面来分析下 执行效果 count(*) 包括了所有的列 ...

  8. 2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。 package main var n = -99 func main() { m := make(map[

    2022-08-21:以下go语言代码输出什么?A:0:B:panic:C:不知道. package main var n = -99 func main() { m := make(map[stri ...

  9. Django4全栈进阶之路22 项目实战(三种方式开发部门管理):方式三:FBV+ModelForm+get_object_or_404

    1.视图 @login_required def department_list_view(request): departments = Department.objects.all() retur ...

  10. 【使用git之旅】

    前言 在学习各种语言的时候我总喜欢把例子改成有自己想法并且有趣的程序, 但是时间一长,我发现在本地管理很麻烦,于是乎想到了github和gitee, 然后昨晚一时兴起,就开始了学习,开个博客记录一下我 ...