[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 标志…...
终极教程:如何用免费Chrome插件一键保存完整网页内容
终极教程:如何用免费Chrome插件一键保存完整网页内容 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extens…...
大语言模型提示工程优化:精准解决机器翻译中的零代词恢复难题
1. 项目概述:当大语言模型遇上机器翻译的“隐形主语”在机器翻译的日常工程实践中,我们常常会遇到一个看似微小却影响深远的“幽灵”问题:零代词。尤其是在处理像中文到英文这类语言差异巨大的翻译任务时,这个问题尤为突出。中文讲…...
RePKG架构深度解析:解密Wallpaper Engine资源处理的核心技术
RePKG架构深度解析:解密Wallpaper Engine资源处理的核心技术 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字内容创作领域,资源打包与纹理处理是图形应…...
终极指南:快速重置JetBrains IDE试用期的完整方案
终极指南:快速重置JetBrains IDE试用期的完整方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾为JetBrains IDE试用期到期而烦恼?面对复杂的评估机制和分散的系统文件ÿ…...
QQ音乐解码工具qmcdump:轻松解密加密音频文件的完整指南
QQ音乐解码工具qmcdump:轻松解密加密音频文件的完整指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是…...
ContextMenuManager:重新定义Windows右键菜单的交互设计思维
ContextMenuManager:重新定义Windows右键菜单的交互设计思维 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 在数字工作流中,我们每天平均…...
SELA框架:融合MCTS与LLM的智能AutoML新范式
1. SELA框架:当MCTS的“棋手”思维遇上LLM的“专家”直觉在数据科学项目里,最耗时的往往不是敲代码,而是做决策。面对一个新的表格数据集,从数据清洗、特征工程到模型选型、调参,每一步都像站在一个岔路口,…...
【芯片测试】:6. 向量、Sequencer 指令与高速串行 IO
Pattern 详解:向量、Sequencer 指令与高速串行 IO系列: Advantest V93000 SmarTest 8 核心概念解析|第 6 篇(共 8 篇) 适合读者: 需要理解数字测试激励数据结构的工程师前言 Pattern(模式&#…...
健身行业AI Agent部署失败率高达68%?(2024真实数据复盘与5步合规上线法)
更多请点击: https://intelliparadigm.com 第一章:健身行业AI Agent部署失败率高达68%?——2024真实数据复盘与5步合规上线法 2024年Q2《中国智能健身系统落地白皮书》抽样调研覆盖全国137家连锁健身房及SaaS服务商,结果显示&…...
随机数值线性代数:原理、算法与应用实践
1. 从“暴力计算”到“巧算”:为什么我们需要随机数值线性代数如果你处理过大规模数据集上的线性回归,或者尝试过对一张几百万像素的图片进行主成分分析,你大概率体会过那种“等不起”的焦虑。传统的数值线性代数方法,比如基于QR分…...
