Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战
知识点1【TFTP的概述】
学习通信的基本:通信协议(具体发送上面样的报文)、通信流程(按照什么步骤发送)
1、TFTP的概述
tftp:简单文件传输协议,**基于UDP,**不进行用户有效性验证
基于UDP:编程架构是UDP的
必须创建UDP套接字
套接字分类:UDP套接字,TCP套接字,原始套接字
数据传输格式(模式选择):
octet:二进制模式
netascii:文本模式
2、TFTP的通信过程
决定了 编程流程
我们主要写客户端
注意:
服务器中,在69号端口后,是临时端口,临时端口是只要socket,不bind。因此需要创建一个新的线程,线程中执行socket()
TFTP通信过程总结
3、TFTP协议分析
读写请求是用户自己发送的,我们现在不考虑选项部分。
数据包516个字节,当小于516个字节的时候,表示下载 结束(最后一个报文),块编号中存储的是该数据包的编号。这里注意一定要对操作码进行判断,是3才可以确认是数据包。
收到数据包 我们需要回复一个ACK,ACK中的块编号需要和数据包的ACK相同
这里有一个技巧,客户端直接把收到的内容的前4个字节发送给服务器,只需要修改操作码的第二个字节即可
错误码操作码是5,差错码是不同的错误有不同的编号,差错信息说明错误。
OACK是比如我们设置了选项部分,需要设置的,相对复杂,我们下面介绍。
想一想
传输的数据的大小一定是 512Byte 吗?
由于网络的原因,一方收不到另一方的数据怎么办?
1、不一定需要512,选项修改
2、这里服务器发送数据包后,如果没有收到ACK,它会等待,并从发送数据包处开始计时,超出 超时时间后,才会发出错误码,提示重发。
而这里的数据包长度修改,超时时间的修改,都需要借助选项来完成
4、TFTP带选项的读写报文
选项和值成对出现。
OACK是在修改了选项后,服务器向客户端发送的一个报文,是起一个确认作用的。
我们结合上图,客户端一旦修改了选项部分,客户端不再是立即发送数据,而是发送OACK,让客户端确认是否要这样修改(通过ACK,块编号中:0表示同意,这也是为什么数据编号是从1开始的),客户端给予回应后,服务器才会执行发送数据的操作。
选项的种类
tsize 选项
当读操作时,tsize 选项的参数必须为“0”,服务器会返回待读取的文件的大小
当写操作时,tsize 选项参数应为待写入文件的大小,服务器会回显该选项
blksize 选项
修改传输文件时使用的数据块的大小(范围:8~65464)
timeout 选项
修改默认的数据传输超时时间(单位:秒)
注意:
1、选项没有顺序
2、在使用tsize 读操作的时候,tsize的默认参数是0(因为读时不知道文件的大小),收到OACK的时候,会返回实际文件的大小(nB说明是字符串需要转换)
总结
1、可以通过发送带选项的读/写请求发送给 server 2、如果 server 允许修改选项则发送选项修改确认包 3、server 发送的数据、选项修改确认包都是临时 port 4、server 通过 timeout 来对丢失数据包的重新发送
知识点2【TFTP案例】
需求:编写TFTP客户端(不带选项),从客户端下载文件
流程:
1、创建UDP套接字
2、构建读请求报文,并发送到服务器69号端口
3、while 循环接收,buf是516个字节,recvform的返回值是获取到数据的长度
这里需要创建一个文件描述符取接收
4、关闭文件描述符 和 套接字
构建 读写请求报文 的方式
使用sprintf组包,当sendto时,有一个内容长度,使用sprintf的返回值:组包的总长度,目的端口写69
代码演示
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char const *argv[])
{if(argc != 3){printf("error\\n");printf("modo:./a.out 196.168.9.28 a.txt\\n");_exit(-1);}//创建套接字,目的:向服务器发送数据int fd_sock = socket(AF_INET,SOCK_DGRAM,0);if(fd_sock < 0){perror("socket");return 0;}//sprintf组包,返回值使用len_sprintf接收。格式: 0 1 文件名 0 模式 0 char arr_sprintf[64] = "";int len_sprintf = sprintf(arr_sprintf,"%c%c%s%c%s%c",0,1,argv[2],0,"octet",0);//发送sprintf组包(读写报文)struct sockaddr_in addr_rw;memset(&addr_rw,0,sizeof(addr_rw));addr_rw.sin_family = AF_INET;addr_rw.sin_port = htons(69);addr_rw.sin_addr.s_addr = inet_addr(argv[1]);sendto(fd_sock,arr_sprintf,len_sprintf,0,(struct sockaddr *)&addr_rw,sizeof(addr_rw));/* 接收服务器发出的 数据报文,报文的前四个字节:操作码(2),端口码(2),数据(512),存储在arr_recv中数据段操作码判断,下面是3的操作重复性判断,定义一个unsigned short num = 0,num+1与端口码比较数据写入文件,并将端口码赋值给numACK 回应服务器 arr_recv前四个字节进行处理即可*///操作码为5操作//关闭套接字 及 文件描述符 //输出错误原因unsigned short num = 0;int fd_w = open(argv[2],O_WRONLY | O_CREAT,0664);if(fd_w < 0){close(fd_sock);perror("open");return 0;}int len = 0;unsigned char arr_recv[516] = "";struct sockaddr_in addr_recv;int len_recv = sizeof(addr_recv);do{len = recvfrom(fd_sock,arr_recv,sizeof(arr_recv),0,(struct sockaddr *)&addr_recv,&len_recv);if(arr_recv[1] == 3){if((unsigned short)(num + 1) == ntohs(*(unsigned short *)(arr_recv +2))){write(fd_w,arr_recv + 4,len - 4);//ack应答num = ntohs(*(unsigned short *)(arr_recv +2));printf("%d\\n",num);}arr_recv[1] = 4;sendto(fd_sock,arr_recv,4,0,(struct sockaddr *)&addr_recv,sizeof(addr_recv));}else if(arr_recv[1] == 5){close(fd_sock);close(fd_w);unlink(argv[2]);printf("%s\\n",arr_recv+4);_exit(-1);}} while (len == 516);//关闭文件描述符,套接字,关闭文件close(fd_w);close(fd_sock);return 0;
}
代码运行结果
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏夹关注,谢谢大家!!!
相关文章:
Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战
知识点1【TFTP的概述】 学习通信的基本:通信协议(具体发送上面样的报文)、通信流程(按照什么步骤发送) 1、TFTP的概述 tftp:简单文件传输协议,**基于UDP,**不进行用户有效性验证 …...
汽车免拆诊断案例 | 2019款大众途观L车鼓风机偶尔不工作
故障现象 一辆2019款大众途观L车,搭载DKV发动机和0DE双离合变速器,累计行驶里程约为8万km。车主进厂反映,鼓风机偶尔不工作。 故障诊断 接车后试车,鼓风机各挡位均工作正常。用故障检测仪检测,空调控制单元&#x…...
编程常见错误归类
上一篇讲了调试,今天通过一个举例回忆一下上一篇内容吧! 1. 回顾:调试举例 在VS2022、X86、Debug的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥? #include <stdio.h> int main() {int …...
Python 3.13 support for PyTorch
Python 3.13 support for PyTorch Python 3.13 support for PyTorch 去官网可以查到具体信息:https://pytorch.org/get-started/locally/ 然后选择自己的CUDA版本,下面会显示下载网站,比如我选择12.4,则会出现:pip3 …...
中国联通:《DeepSeek洞察与大模型应用:人工智能技术发展与应用实践》(可下载)
近年来,人工智能(AI)技术迅猛发展,尤其是大模型技术的崛起,正在深刻改变各行各业的运营模式和创新路径。作为中国通信行业的领军企业之一,中国联通积极拥抱AI技术变革,结合自身在通信网络、大数…...
k8s 调整Node节点 Max_Pods
默认情况下,Kubernetes集群中一个Node最多能起110个Pod。 这是基于性能和资源管理的考虑,以确保Kubernetes集群的稳定性和可靠性。 查看kht125节点上支持的最大pod数量: kubectl describe node kht125 | grep -i “Capacity|Allocatable” -A 6 调整…...
VR拍摄要点与技巧有哪些?有哪些最佳实践?
VR拍摄要点与技巧:最佳实践 VR技术通过模拟环境,使用户能够沉浸在一个完全由计算机生成的虚拟世界中,进行互动体验。在VR拍摄领域,我们主要利用这一技术来创建360度全景视频或图片,让观众能够全方位、无死角地感受拍摄…...
使用 Docker 安装 Elastic Stack 并重置本地密码
Elastic Stack(也被称为 ELK Stack)是一个非常强大的工具套件,用于实时搜索、分析和可视化大量数据。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等组件。本文将展示如何使用 Docker 安装 Elasticsearch 并重置本地用户密码。 ###…...
安卓手机万能遥控器APP推荐
软件介绍 安卓手机也能当“家电总控台”?这款小米旗下的万能遥控器APP,直接把遥控器做成“傻瓜式操作”——不用配对,不连蓝牙,点开就能操控电视、空调、机顶盒,甚至其他品牌的电器!雷总这波操作直接封神&…...
PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
在孩子的成长过程中,总有那么一些“与众不同”的孩子。他们似乎总是坐不住,课堂上小动作不断,注意力难以集中,作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而,他们可能并不只是“…...
Linux 系统编程 day4 进程管道
进程间通信(IPC) Linux环境下,进程地址空间相互独立,任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓冲区…...
基于DeepSeek的考研暑假日志分析
注:我去年考研时写了日志,大致记录了我每天的主要活动。由于过于琐碎,一直没有翻看。突发奇想,现在利用deepseek总结其中规律。 从你的日志中可以总结出以下规律和活动兴衰起落: 一、学习活动规律与演变 …...
Python 写生成 应用商店(2025版) 网页 方便收集应用 ,局域网使用
工具【1】:nginx 配置 nginx.conf 文件 server { listen 8080; server_name example.com; location / { root E:/BIT_Soft_2025; index index.html index.htm; } # 定义错误页面 error_page 404 /4…...
LLaMA Factory多模态微调实践:微调Qwen2-VL构建文旅大模型
LLaMA Factory 是一款开源低代码大模型微调框架,集成了业界最广泛使用的微调技术,支持通过 Web UI 界面零代码微调大模型,目前已经成为开源社区内最受欢迎的微调框架之一,GitHub 星标超过 4.7 万。本教程将基于通义千问团队开源的…...
Ubuntu20.04 部署llama-factory问题集
llama3 微调教程之 llama factory 的 安装部署与模型微调过程,模型量化和gguf转换。_llamafactory 部署-CSDN博客 1.跟着教程 llama-factory下载不下来 来,试着换源,多试几次,就可以成功了。。。 2.跟着教程,发现无法…...
鸿蒙语言基础
准备工作 去鸿蒙官网下载开发环境 点击右侧预浏览,刷新和插销按钮,插销表示热更新,常用按钮。 基础语法 string number boolean const常量 数组 let s : string "1111"; console.log("string", s);let n : number …...
每天一道C语言精选编程题之字符串拷贝
题目描述 写⼀个函数my_strcpy,实现拷⻉字符串的功能,假设给定⼀个字符数组a,再给定⼀个字符数组b,将字符串a中的内容拷⻉到字符串b中,拷⻉内容包含字符串末尾的 \0 字符。 解法思路 使⽤ while 循环通过指针的⽅式逐…...
C#中扩展方法和钩子机制使用
1.扩展方法: 扩展方法允许向现有类型 “添加” 方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像实例方法一样进行调用。 使用场景: 1.当无法修改某个类的源代码&#…...
基于CNN与VGG16的图像识别快速实现指南
基于CNN与VGG16的图像识别快速实现指南 以下是从零实现代码到原理剖析的完整流程,包含TensorFlow/Keras框架的代码示例与关键优化技巧,满足快速实验需求。 一、核心原理对比 特性CNN(基础模型)VGG16结构深度5-10层(如…...
中间件--ClickHouse-9--MPP架构(分布式计算架构)
1、MPP 架构基础概念 MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构,专门设计用来高效处理大规模数据集。在这种架构下*,数据库被分割成多个部分,每个部分可以在不同的服务器节点上并行处理*。这意味着ÿ…...
如何在PDF.js中改造viewer.html以实现PDF的动态加载
在PDF.js中改造viewer.html实现PDF动态加载,需结合参数传递、文件流处理及跨域配置等技术。以下是综合多个技术方案的核心实现步骤: 一、基础参数传递法 1. URL参数动态加载 通过修改viewer.html的URL参数传递PDF路径,适用于静态文…...
Android——动画
帧动画 帧动画就是很多张图片,一帧一帧的播放,形成的一个动画效果。 frame.xml <?xml version"1.0" encoding"utf-8"?> <animation-list xmlns:android"http://schemas.android.com/apk/res/android">&l…...
基于linux 设置无线网卡Monitor模式 sniffer抓包
硬件 TP-WN722N 开源无线网卡 网卡设置成抓包模式,条件是什么? 硬件条件 网卡芯片支持监听模式,外置天线或高增益天线可提升抓包效果驱动与软件条件:正确的驱动程序系统与权限条件 Linux:原生支持(Kali …...
Ubuntu18.04安装Qt5.12
本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…...
克服储能领域的数据处理瓶颈及AI拓展
对于储能研究人员来说,日常工作中经常围绕着一项核心但有时令人沮丧的任务:处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格,研究人员的大量时间都花在了提取有意义的见解上。长期以来,该领域一直受到对专…...
PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性
我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点:PDF.js 本身主要是阅读器,不是编辑器 首先,最重要的一点是:PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染…...
L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元…...
【第48节】探究汇编使用特性:从基础到混合编程
目录 引言 一、调用约定的奥秘 1.1 . C调用约定(_cdecl) 1.2 stdcall调用约定(_stdcall) 1.3 fastcall快速调用约定(_fastcall) 1.4 thiscall调用约定(C类成员函数) 二、X64汇…...
【jenkins】首次配置jenkins
第一步,输入管理员密码 cat /var/jenkins_home/secrets/initialAdminPassword第二步,点击安装推荐的插件 第三步,创建管理员用户 第四步,返回实例 第五步, 升级jenkins 第六步, 修复提示 第七步,…...
Python 项目文档编写全攻略:从入门到自动化维护
引言 在软件开发领域,完善的文档可提升 40% 的团队协作效率(来源:IEEE 2022 年开发者调查报告 ^^1^^)。本文将深入探讨 Python 项目文档的最佳实践,涵盖文档生成工具、注释规范、自动化维护等关键环节。 一、Python 文…...
基于 React 和 CodeMirror 实现自定义占位符编辑器
npm git 在前端开发中,我们经常需要实现各种复杂的编辑器功能,比如代码编辑器、富文本编辑器等。本文将介绍如何基于 React 和 CodeMirror 实现一个带有自定义占位符功能的编辑器,这种编辑器在模板系统、表单设计器等场景中非常有用。 一…...
GitHub Copilot在产品/安全团队中的应用实践:处理Markdown、自动化报告与电子表格、使用CLI命令等
本文来源github.com,由GitHub中国授权合作伙伴-创实信息翻译整理。 在当今的快节奏时代,技术和非技术团队之间的协作至关重要,事实证明,GitHub Copilot等工具已成为不可或缺的助手。这些由AI驱动的工具已不只是开发者的“秘密武器…...
嵌入式系统中Flash操作全面解析与最佳实践
嵌入式系统中Flash操作全面解析与最佳实践 一、Flash存储器基础与分类 Flash存储器是嵌入式系统中最重要的非易失性存储介质,根据内部架构和工作原理主要分为两大类: 1.1 NOR Flash与NAND Flash对比 特性NOR FlashNAND Flash架构随机存取架构串行存取…...
tomcat 的安装与启动
文章目录 tomcat 服务器安装启动本地Tomcat服务器 tomcat 服务器安装 https://tomcat.apache.org/下载 Tomcat 10.0.X 启动本地Tomcat服务器 进入 Tomcat 的 bin...
Flash存储器(二):SPI NAND Flash与SPI NOR Flash
目录 一.存储架构 二.接口与封装 三.特性对比 四.典型应用场景 4.1 SPI NOR Flash 4.2 SPI NAND Flash 五.技术演进与市场趋势 六.选择建议 6.1 选择SPI NOR的场景 6.2 选择SPI NAND的场景 SPI NAND Flash和SPI NOR Flash是嵌入式设备中常用的存储器。下面通过全面对…...
第 7 期:DDPM 采样提速方案:从 DDPM 到 DDIM
本期关键词:采样加速、DDIM 推导、可控性提升、伪逆过程、代码实战 前情回顾:DDPM 的采样瓶颈 在前几期中,我们构建了一个完整的 DDPM 生成流程。但是你可能已经发现: 生成一张图像太慢了!!! 原因是: DDPM 要在 T 个时间步中一步步地去噪,从 x_T → x_0。而通常 T 至…...
axios 模拟实现
axios 模拟实现 包含[发送请求,拦截器,取消请求] 第一步 , axios模拟发送请求 //使用 xhr 发送请求function xhr_adpter(config){return new Promise(function handle(resolve,reject){let xhr new XMLHttpRequest();xhr.open(config.method, config.url,true);xhr.onreadys…...
架构师面试(三十一):IM 消息收发逻辑
问题 今天聊一下 IM 系统最核心的业务逻辑。 在上一篇短文《架构师面试(三十):IM 分层架构》中详细分析过,IM 水平分层架构包括:【入口网关层】、【业务逻辑层】、【路由层】和【数据访问层】;除此之外&a…...
hadoop三大组件的结构及各自的作用
1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系统,用于存储和管理海量数据。它具有高容错性、高吞吐量和可扩展性,能够在多个节点上存储和管理大规模数据 1.2架构:采用主从架构,由一个 NameNode 和多个 DataNode 组成。NameNode…...
GEE学习笔记 29:基于GEE的多源Landsat合成与植被指数时序提取
基于GEE的多源Landsat合成与植被指数时序提取 🌿 1.写在前面 | 基于GEE的Landsat多尺度植被指数提取脚本📌 2.常用植被指数计算公式2.1. 🌿 NDVI(归一化植被指数)Normalized Difference Vegetation Index2.2. 🌱 EVI(增强型植被指数)Enhanced Vegetation Index2.3.…...
负载均衡的策略
目的:将请求均衡分发到后台的服务器 算法: 随机算法:随机数获取服务器加权随机算法:根据权重,增加某些服务器(性能比较好等)选择的随机比例轮询算法:轮流分发给服务器加权轮询算法…...
AWS Elastic Beanstalk的部署Python Flask后端服务(Hello,World)
问题 最近需要使用AWS Elastic Beanstalk来部署Python的Flask后端web接口。这里先做一个最简单的Flask Hello,World接口服务程序。 Flask工程与代码 创建本地虚拟环境 conda create -n flask python3.13 # 激活 conda activate flaskapp.py from flask import …...
Hadoop的三大结构及各自的作用?
1.HDFS 作用: 存储海量数据,支持高容错(数据自动备份)和高吞吐量(适合大文件读写)。 采用主从架构: NameNode:管理文件系统的元数据(如文件目录结构)。 Dat…...
在Ubuntu系统中安装和升级RabbitVCS
在Ubuntu系统中安装和升级RabbitVCS 目前在ubuntu中使用svn的GUI工具,已经安装了。想升级一下。 当前遇到的问题是,我想用它看看我当前的代码对应的版本号,然后再决定是否update。但是,好像我看不出来。根本不如在windows使用To…...
深入理解红黑树:原理、实现与应用
深入理解红黑树:原理、实现与应用 引言 红黑树(Red-Black Tree)是计算机科学中一种重要的自平衡二叉查找树。它通过简单的规则和高效的调整策略,保证了插入、删除、查找等操作的时间复杂度均为 O(log n)。红黑树广泛应用于实际开…...
Java学习手册:Java并发编程最佳实践
在Java并发编程中,遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践,帮助开发者避免常见陷阱并编写高效的并发程序。 1. 选择合适的并发工具 Java提供了丰富的并发工具,选择合适的工具可以简…...
接口自动化测试(二)
一、接口测试流程:接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情:理解需求,学会看接口文档 只需要找到我…...
C++类和对象上
1. 面向对象编程与面向过程编程的比较 我们一开始接触的C语言就是一门面向过程编程的语言,而C就是一门面向对象编程的语言。那么这两者有什么区别呢? 举个例子,就比如说点外卖,如果是C语言的话,那么在程序的编写过程…...
hadoop的三大结构及各自的作用
Hadoop 分布式文件系统(HDFS) 存储大量数据:HDFS 被设计用于在商品硬件上存储海量数据,它将大文件分割成多个数据块,并分布存储在集群中的不同节点上,支持数据的可靠存储和高效访问。提供数据冗余和容错机制…...
珈和科技遥感赋能农业保险创新 入选省级卫星应用示范标杆
为促进空天信息与数字经济深度融合,拓展卫星数据应用场景价值,提升卫星数据应用效能和用户体验,加速卫星遥感技术向民生领域转化应用,近日,湖北省国防科工办组织开展了2024年湖北省卫星应用示范项目遴选工作。 经多渠…...