[C++ 网络协议编程] UDP协议
目录
1. UDP和TCP的区别
2. UDP的工作原理
3. UDP存在数据边界
4. UDP的I/O函数
4.1 sendto函数
4.2 recvfrom函数
4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字
5. UDP的通信流程
5.1 服务器端通信流程
5.2 客户端通信流程
1. UDP和TCP的区别
主要区别:
- TCP和UDP的主要区别是,TCP具有流控制机制,而UDP没有。
- UDP性能比TCP高,在数据量大的情况下,TCP的性能会接近UDP的性能,但无法超过UDP。
TCP比UDP慢的原因主要如下:
1. 收发数据前后进行的连接设置及清除过程
2. 收发数据过程中为保证可靠性而添加的流控制
3. UDP不如TCP可靠,有可能会发生数据的丢失。
2. UDP的工作原理

如图,IP的作用是让数据准确传到主机A,而UDP的最重要的作用就是把数据准确的传到主机A的指定套接字上。
3. UDP存在数据边界
为什么说UDP存在数据边界?
因为:
1.与TCP不同,UDP的通信过程中,I/O函数的调用次数必须保持一致,即客户端sendto了几次,服务器端也要recvfrom几次。
2.同时也因为UDP每次传输的数据包又称为UDP数据报,数据报也是数据包的一种,不同的是,UDP数据报本身可以成为1个完整的数据,而TCP的一个完整的数据可以由多个数据包组成。
4. UDP的I/O函数
4.1 sendto函数
#include<sys/socket.h>
ssize_t sendto(
int sock, //用于传输数据的UDP套接字文件描述符
void *buff, //保存待传输数据的缓冲地址值
size_t nbytes, //待传输的数据长度,以字节为单位
int flags, //可选项参数,没有就设置为0
struct sockaddr* to, //存有目标地址信息的sockaddr结构体变量的地址值
socklen_t addrlen //传递给参数to的地址值结构体变量长度
);
成功返回传输的字节数,失败返回-1
UDP的套接字不会保持连接状态,因此每次传输数据都要添加目标地址信息。
4.2 recvfrom函数
#include<sys/socket.h>
ssize_t recvfrom(
int sock, //用于接收数据的UDP套接字文件描述符
void* buff, //保存接收数据的缓冲地址值
size_t nbytes, //可接受的最大字节数,无法超过buff的大小
int flags, //可选项参数,没有则传0
struct sockaddr* from, //存有发送端地址信息的sockaddr结构体变量的地址值
socklen_t *addrlen //保存参数from的结构体变量长度的地址值
);
4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字
已连接UDP套接字:执行了connect函数或bind函数,套接字绑定了某主机IP和端口号
未连接UDP套接字:未执行connect函数或bind函数,套接字在每次执行sendto函数时,再绑定某主机IP和端口号。
UDP中通过sendto函数传输数据可分为三个阶段:
- 第一阶段:向UDP套接字注册目标IP和端口号
- 第二阶段:传输数据
- 第三阶段:删除UDP套接字中注册的目标信息地址
所以,未连接UDP套接字,可以重复利用同一个UDP套接字,向不同主机传输数据。但如果你每次都是向同一个主机传输多次,那么上述阶段会重复多次,这样会大大的消耗程序性能,因为sendto函数的第一阶段和第三阶段占整个通信过程的1/3,所以,这种情况下,你可以使用已连接套接字,在sendto函数前就先调用connect函数或bind函数,绑定IP和端口号,这样sendto函数就会节省第一阶段和第二阶段的时间,提高程序效率。
5. UDP的通信流程
5.1 服务器端通信流程
第一步:使用socket函数创建套接字
第二步:使用bind函数绑定IP地址和端口号(可以省略这一步,但如果是多次要与同一个主机通信,那么增加这一步可以增加性能)
第三步:使用sendto(或write)发送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已连接UDP套接字)
第四步:关闭套接字
和TCP不一样,UDP无需执行listen,accept函数,可以不执行bind函数。
5.2 客户端通信流程
第一步:使用socket函数创建套接字
第二步:使用connect函数连接IP地址和端口号(可以省略这一步,但如果是多次要与同一个主机通信,那么增加这一步可以增加性能)
第三步:使用sendto(或write)发送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已连接UDP套接字)
第四步:关闭套接字
和TCP不一样,UDP可以不执行connect函数,连接服务器端。
相关文章:
[C++ 网络协议编程] UDP协议
目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…...
reactNative跳转appstore链接报错:Redirection to URL with a scheme that is not HTTP(S)
在reactnative中webview跳转H5下载页面,包错Redirection to URL with a scheme that is not HTTP(S) 在webview中添加一下代码 const onShouldStartLoadWithRequest (event: any) > {const { url } event;console.log(url);if (url.startsWith(https://itune…...
html css实现爱心
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…...
react中使用shouldComponentUpdate生命周期函数调用setState引起的无限循环的错误
场景: 在 React 组件中,当在 componentWillUpdate 或 componentDidUpdate 生命周期方法中调用 setState 时,会触发无限循环,导致超过最大更新深度。 错误原因 在React组件中 ,我们使用componentWillUpdate 或 componen…...
麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?
近日,麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势,并把他们分为5大类,人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一:人工智能革命 生成式AI 生成型人工智能标志着人工智…...
【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)
对目标网站的背景调研 检查 robot.txt估算网站大小识别网站所用技术寻找网站的所有者 检查 robot.txt 目的: 大多数的网站都会包含 robot.txt 文件。该文件用于指出使用爬虫爬取网站时有哪些限制。而我们通过读 robot.txt 文件,亦可以最小化爬虫被封禁的…...
maven如何建立JavaWeb项目并连接数据库,验证登录
这里是建立建立web项目:Maven如何创建Java web项目(纯干货版)!!!_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面:index.jsp 还需要再…...
CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)
注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…...
动态规划(基础)
一,背包问题 老规矩,上链接(http://t.csdn.cn/hEwvu) (1)01背包问题 给定一个承重量为C的背包,n个重量分别为w1,w2,...,wn的物品,物品i放入背包能产生pi(>0)的价值(i1,…...
【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector
文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1)在自然语言处理NLP领域,是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度,通常在几…...
动态库的命名规则
1、动态库的命名规则:libname.so.x.y.z 名字含义lib这是共享库的前缀name共享库名字x主版本号y次版本号z发布版本号 2、每个版本号的含义 版本号含义主版本号表示库的重大升级,不同主版本号的库之间是不兼容的。依赖旧的主版本号的程序需要改动相应的…...
【Linux】网络---->网络理论
网络理论 网络协议分层模型网络数据的封装于分用地址管理 网络协议分层模型 OSI五层模型:应用层,传输层,网络层,数据链路层,物理层 应用层:主要负责应用程序间的沟通,代表协议有HTML协议&#x…...
Android学习之路(4) UI控件之输入框
本节引言: 在本节中,我们来学习第二个很常用的控件EditText(输入框); 和TextView非常类似,最大的区别是:EditText可以接受用户输入! 1.设置默认提示文本 如下图,相信你对于这种用户登录的界面并…...
1.初识Web
文章目录 1. 什么是Web?2.初始Web前端2.1.Web标准 1. 什么是Web? web:全球广域网,也称万维网(www World Wide Web),能够通过浏览器访问的网站。 2.初始Web前端 网页有哪些部分组成? 文字、图片、音频、视频、超链接… 我们看到的网页&am…...
【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)
微服务技术一 技术栈图一、注册中心Eureka概念:搭建EurekaServer服务注册服务发现(消费者对提供者的远程调用) 二、Ribbon负载均衡负载均衡的原理:LoadBalanced负载均衡的策略:IRule懒加载 三、Nacos注册中心Nacos的安…...
【Linux】可重入函数 volatile关键字 以及SIGCHLD信号
可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数: 假设我们现在要对…...
【动态规划】回文串问题
文章目录 动态规划(回文串问题)1. 回文子串2. 最长回文子串3. 回文串分割 IV4. 分割回文串 ||5. 最长回文子序列6. 让字符串成为回文串的最小插入次数 动态规划(回文串问题) 1. 回文子串 题目链接 状态表示 f[i][j]表示 i 到 j …...
Laravel Swift Mail发送带附件的邮件报错 “Swift_IoException The path cannot be empty“处理
先说下情况,就是我要做一个发送附件的邮件发送功能,结果,报错:The path cannot be empty。给我整的有点迷糊,网上也没有类似的问题。后来,我检查了一下代码,发现有个地方,是需要给附…...
Linux下常见的代理服务器软件介绍
在Linux系统中,代理服务器是我们搭建网络环境和处理网络请求的常用工具。但是,你知道Linux下常见的代理服务器软件有哪些吗?本文将为你带来对几款常见的Linux代理服务器软件的介绍,帮助你选择适合的代理服务器。 一、Squid&#…...
SCSS的基本用法
1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法,右半部分是编译后的css。(整篇文章皆是如此) 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…...
Windows热键冲突检测:3分钟找出占用程序的智能工具
Windows热键冲突检测:3分钟找出占用程序的智能工具 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 当你的CtrlC…...
ModTheSpire开源工具:5大核心策略提升Slay The Spire模组体验
ModTheSpire开源工具:5大核心策略提升Slay The Spire模组体验 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 一、环境部署与资源配置:从零开始的模组加载器搭建…...
深圳SEO公司为什么要定期优化网站
深圳SEO公司为什么要定期优化网站 在当今数字化时代,拥有一个优秀的网站已经不再足以满足企业的需求。随着互联网市场的竞争日益激烈,深圳SEO公司认识到定期优化网站的重要性,并将其作为持续提升网站流量和业务发展的核心策略之一。为什么深…...
OpenClaw定时任务技巧:让Kimi-VL-A3B-Thinking自动处理每日图文简报
OpenClaw定时任务技巧:让Kimi-VL-A3B-Thinking自动处理每日图文简报 1. 为什么需要自动化图文简报 每天早上打开电脑,我的第一件事就是浏览行业资讯、技术博客和社交媒体,把有价值的内容整理成简报。这个过程通常要花费30-45分钟࿰…...
Qwen3-14B私有部署案例:电商客服话术生成与情感倾向优化实践
Qwen3-14B私有部署案例:电商客服话术生成与情感倾向优化实践 1. 项目背景与需求分析 电商客服每天需要处理大量重复性问题,传统人工回复效率低下且难以保证一致性。我们基于Qwen3-14B模型构建了智能客服话术生成系统,主要解决以下痛点&…...
RoboStudio6.08学习记录(1)
一.软件安装一、下载RobotStudio软件官方1. 请登陆网址:https://new.abb.com/products/robotics/robotstudio。2. 单击进入页面“下载RobotStudio软件”3. 单击填写信息后,可以获得下载链接二、安装RobotStudio软件1. 下载完成后,对压缩包进行…...
别盲目冲网安!普通本科转行 5 年月薪 2 万 +,掏心窝子真话
别盲目冲网安!普通本科转行5年,月薪2万的真心话 网安行业确实火,但真话难听:这行超卷,缺的是能干活的实战派,不是凑数的小白。 我普通本科出身,转行网安5年,如今月薪2万࿰…...
全网SEO推广如何提升网站流量
全网SEO推广如何提升网站流量 在当今互联网时代,网站流量的提升对于任何企业或个人来说都是至关重要的。网站流量直接影响到网站的曝光度、销售转化和品牌知名度。全网SEO推广作为一种有效的提升网站流量的方法,越来越受到关注。全网SEO推广究竟是如何提…...
bert-base-chinese新手必看:完形填空与语义相似度功能实测教程
bert-base-chinese新手必看:完形填空与语义相似度功能实测教程 1. 快速了解bert-base-chinese bert-base-chinese是Google发布的经典中文预训练模型,作为NLP领域的基础模型,它已经成为中文自然语言处理任务的标准选择之一。这个模型特别适合…...
ClassGraph构建时扫描:Android注解处理的完整解决方案
ClassGraph构建时扫描:Android注解处理的完整解决方案 【免费下载链接】classgraph An uber-fast parallelized Java classpath scanner and module scanner. 项目地址: https://gitcode.com/gh_mirrors/cl/classgraph ClassGraph是一个超高速并行化的Java类…...
