【网络编程】基于UDP的TFTP文件传输
1)tftp协议概述

简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输
特点:
是应用层协议
基于UDP协议实现
数据传输模式
octet:二进制模式(常用)
mail:已经不再支持
2)tftp下载模型
TFTP通信过程总结


- 服务器在69号端口等待客户端的请求
- 服务器若批准此请求,则使用 临时端口 与客户端进行通信。
- 每个数据包的编号都有变化(从1开始)
- 每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包
- 数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。
代码实现
main.c
#include"tftp.h"int main(int argc, const char *argv[])
{int cmd = 0;//用来标记操作char filename[20] = "";//存放文件名int cfd = socket(AF_INET,SOCK_DGRAM,0);//创建套接字文件if(cfd == -1){perror("socket error");return -1;}while(1){menu();printf("请输入要执行的操作:");scanf("%d",&cmd);switch(cmd){case 1:printf("请输入文件名:");scanf("%s",filename);download(cfd,filename);break;case 2:printf("请输入文件名:");scanf("%s",filename);upload(cfd,filename);break;case 3:printf("退出\n");goto END;break;default:printf("输入错误\n");break;}}
END://关闭文件描述符close(cfd);return 0;
}
tftp.c
#include"tftp.h"
//菜单
void menu()
{printf("-------------------------\n");printf("--------1.下载文件--------\n");printf("--------2.上传文件--------\n");printf("--------3.退出------------\n");printf("-------------------------\n");
}//上传
int upload(int cfd , char *filename)
{char buf[N] = "";short *p1 = (short*)buf;*p1 = htons(2);//设置操作码为2,表示上传char *p2 = buf + 2;//文件名的起始位置strcpy(p2,filename);char *p4 = p2 + strlen(p2) + 1;//模式的起始位置strcpy(p4,"octet");int size = 2 + strlen(p2) + strlen(p4) + 2;//计算请求包的总长度//打开本地文件int fd = open(filename,O_RDONLY);if(fd == -1){perror("open error");return -1;}//绑定服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);socklen_t len = sizeof(sin);//给服务段发送请求if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("sendto error");return -1;} short flag = 1;//设置标示位//收发数据while(1){//清空数据bzero(buf,sizeof(buf));if(recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&len)==-1){perror("recvfrom error");return -1;}//将ack改造成为数据包if(buf[1] == 4 || flag == buf[2]){int res = read(fd,buf+4,sizeof(buf)-4);//从buf的5个开始放数据,读取buf-4个数据if(res < 0){perror("read error");return -1;}if(res == 0){printf("文件发送完毕\n");return -1;}buf[1]=3;buf[3] = flag;if(sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("sendto error");return -1;} flag++;}if(buf[1] == 5){printf("接收错误\n");break;}}
}//下载
int download(int cfd ,char *filename)
{char buf[N] = "";short *p1 = (short*)buf;*p1 = htons(1);//设置操作码为1,表示下载char *p2 = buf + 2;//文件名的起始位置strcpy(p2,filename);char *p4 = p2 + strlen(p2) + 1;//模式的起始位置strcpy(p4,"octet");int size = 2 + strlen(p2) + strlen(p4) + 2;//计算请求包的总长度//创建本地文件int fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC,0644);if(fd == -1){perror("open error");return -1;}//绑定服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);socklen_t len = sizeof(sin);//给服务段发送请求if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("sendto error");return -1;} short flag = 1;//设置标示位while(1){//清空bzero(buf,sizeof(buf));//获取服务器发来的包int res = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&len);if(res == -1){perror("recvfrom error");return -1;}//判断是否是数据包if(buf[1] == 3 && flag == ntohs(*(short*)(buf+2))){//将数据写入文件中if(write(fd,buf+4,N-4)==-1){perror("write error");return -1;}//返回ackbuf[1] = 4; if(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}flag++;//确保和需要的块编号一致}//判断是否是错误包if(buf[1] == 5){printf("文件发送错误\n");}//判断是否发送完毕if(res < 516){printf("文件接收完毕\n");return -1;}}
}
tftp.h
#ifndef TFTP_H
#define TFTP_H
#define SER_PORT 69
#define SER_IP "192.168.1.4"
#define N 516
#include<myhead.h>
//菜单
void menu();//上传
int upload(int cfd , char *filename);//下载
int download(int cfd ,char *filename);#endif
效果展示


相关文章:
【网络编程】基于UDP的TFTP文件传输
1)tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输 特点: 是应用层协议 基于UDP协议实现 数据传输模式 octet:二进制模式(常用) mail:已经不再…...
Vue 3 + Pinia 实现网页刷新功能
概述 在现代 Web 开发中,保持用户界面的动态性和响应性至关重要。当用户触发某些操作时,例如点击按钮或者完成表单提交,我们往往需要刷新页面的一部分来展示最新的数据。本文将介绍如何使用 Vue 3 和 Pinia 来实现这一功能。 技术栈 Vue 3…...
DVWA综合靶场漏洞讲解
目录 综合靶场漏洞讲解 Brute Force Low Medium High Command Injection Low Medium High File Inclusion Low,Medium,High File Upload Low Medium High SQL Injection Low Medium High SQL Injection (Blind) Low Medium High XSS(DOM&am…...
实现Bezier样条曲线
1.给出n1 个控制点pk(xk,yk,zk),这里k可取值0-n,多项式函数公式如下 获取的单个点的代码 void zmBezier::getPoint(float u, double p[3]) {int n m_count - 1;double x 0, y 0, z 0;for(int k 0; k < n; k){x m_ctrlPoints[k][0] * BEZ_k_n(n, k, u);y m_ctrlPoin…...
MySQL中的EXPLAIN的详解
一、介绍 官网介绍: https://dev.mysql.com/doc/refman/5.7/en/explain-output.htmlhttps://dev.mysql.com/doc/refman/8.0/en/explain-output.htmlexplain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句ÿ…...
LearnOpenGL——SSAO学习笔记
LearnOpenGL——SSAO学习笔记 SSAO一、基本概念二、样本缓冲三、法向半球四、随机核心转动五、SSAO着色器六、环境遮蔽模糊七、应用SSAO遮蔽因子 SSAO 一、基本概念 环境光照是我们加入场景总体光照中的一个固定光照常量,它被用来模拟光的散射(Scattering)。散射应…...
[C语言]-基础知识点梳理-文件管理
前言 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作 文件 为什么要使用文件? 程序的数据是存储在电脑的内存中,如果程序退出,内存回收&…...
pcdn闲置带宽被动收入必看教程。第五讲:光猫更换和基础设置
PCDN闲置带宽被动收入必看教程 —— 第五讲:光猫更换和基础设置 为了从闲置带宽中获得被动收入,高效的网络设备至关重要。运营商提供的光猫通常能满足日常家用需求,但对于PCDN应用来说,它们可能不足以提供所需的高性能和稳定性。…...
工业数据采集网关简介-天拓四方
随着工业4.0和物联网(IoT)技术的深入发展,工业数据采集网关作为连接现场设备与上层管理系统的关键节点,其在智能工厂中的作用愈发凸显。本文将深入探讨工业数据采集网关的功能、特点、应用场景及其实操性,以期为读者提…...
Java 调整字符串,验证码生成
package text7;public class ZiFanz {public static void main(String[] args) {//1.定义两个字符串String strA "abcde";String strB "deabc";//2.abcde->bcdea->cdeab->deabc旋转字符串//旋转并比较boolean result cheak(strA, strB);System…...
【专题】全球商用服务机器人市场研究(2023)报告合集PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37366 近年来,随着人工智能、物联网和自动化技术的不断进步,商用服务机器人行业迅速崛起,展现出广阔的发展前景。从最初的实验室研发到如今的规模化应用,商用服务机器人已逐渐成为各行…...
SQL UA注入 (injection 第十八关)
简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&a…...
初阶数据结构之计数排序
非比较排序 计数排序 计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。 操作步骤: 1)统计相同元素出现次数 2)根据统计的结果将序列回收到原来的序列中 #include "CountSort.h" void Count(int* arr, int n)…...
【开端】记一次诡异的接口排查过程
一、绪论 最近碰到这么一个情况,接口请求超时。前提是两台服务器间的网络是畅通的,端口也是通,应用代码也是通。意思是在应用上,接口没有任何报错,能正常返回数据。客户端到服务端接口也能通,但是接收不到服…...
jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目
各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇࿰…...
第2章 C语言基础知识
第2章 C语言基础知识 1.printf()函数 在控制台输出数据,需要使用输出函数,C语言常用的输出函数为printf()。 printf()函数为格式化输出函数,其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…...
鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)
一、鹭鹰优化算法介绍 鹭鹰优化算法(Secretary Bird Optimization Algorithm, SBOA)是一种新型的元启发式算法,它于2024年4月由Youfa Fu等人提出,并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…...
MySQL基础练习题48-连续出现的数字
目录 题目 准备数据 分析数据 题目 找出所有至少连续出现三次的数字。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Logs (id int, num int)## 向表中插入数据 Truncate table Logs insert into Logs (id, num) values (1, 1) i…...
webrtc学习笔记2
音视频采集和播放 打开摄像头并将画面显示到页面 1. 初始化button、video控件 2. 绑定“打开摄像头”响应事件onOpenCamera 3. 如果要打开摄像头则点击 “打开摄像头”按钮,以触发onOpenCamera事件的调用 4. 当触发onOpenCamera调用时 a. 设置约束条件,…...
Simple RPC - 06 从零开始设计一个服务端(上)_注册中心的实现
文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现…...
无感定位技术白皮书——ReID跨镜靠特征接力,原生时空轨迹实现无短板碾压
无感定位技术白皮书——ReID跨镜靠特征接力,原生时空轨迹实现无短板碾压前言在智慧安防、智慧园区、工业物联网等数字化转型核心场景中,跨摄像头目标追踪与精准定位是支撑场景智能化升级的关键底座。长期以来,ReID(行人重识别&…...
RFSoC开发避坑指南:手把手教你理解并配置RF数据转换器的核心结构体(以XRFdc为例)
RFSoC开发实战:深度解析XRFdc结构体配置与避坑策略 第一次打开xrfdc.h头文件时,面对密密麻麻的结构体定义,我的鼠标滚轮不由自主地滑动了三分钟才看完所有内容。作为曾经在RFSoC项目上踩过无数坑的开发者,我完全理解那种面对数十个…...
开源APM探针bee-apm:无侵入式Java应用性能监控与链路追踪实战
1. 项目概述:从“蜜蜂”视角重新审视应用性能在分布式系统和微服务架构成为主流的今天,一个用户请求的背后,可能串联着十几个甚至几十个不同的服务。当线上出现一个性能瓶颈或一个诡异的错误时,定位问题的过程就像在漆黑的迷宫里寻…...
GraphQL-WS服务器配置:完整参数详解与最佳实践
GraphQL-WS服务器配置:完整参数详解与最佳实践 【免费下载链接】graphql-ws Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-ws GraphQL-WS…...
TLM通信:从基础操作到UVM高级连接模式
1. TLM通信基础:从信号级到事务级的跨越 第一次接触TLM这个概念时,我正被一堆信号线搞得焦头烂额。当时在做一个以太网MAC验证项目,每次调试都要跟踪几十根信号线的时序,简直像在解一团乱麻。直到同事提醒我:"为什…...
RISC-V SoC上DNN加速的内存优化与FTL算法实践
1. RISC-V SoC上的DNN加速内存优化挑战在边缘计算场景下,深度神经网络(DNN)的部署面临严峻的内存带宽挑战。典型的RISC-V异构SoC(如Siracusa)采用多级软件管理内存架构,包含L1紧耦合存储器(32KB)、L2共享缓…...
开源AI智能体技能库:模块化设计赋能AI应用开发
1. 项目概述:一个开源的AI智能体技能库最近在GitHub上闲逛,发现了一个挺有意思的项目,叫free-ai-agent-skills。光看名字,你可能会觉得这又是一个堆砌各种AI工具调用的代码仓库。但点进去仔细研究后,我发现它的定位和设…...
给STM32加个‘U盘’:手把手教你用W25Q64 Flash芯片实现掉电不丢失的数据存储
给STM32加个‘U盘’:手把手教你用W25Q64 Flash芯片实现掉电不丢失的数据存储 在嵌入式系统开发中,数据存储一直是个让人头疼的问题。想象一下,你花了一周时间调试的传感器参数,因为一次意外断电全部丢失;或者精心收集的…...
15分钟掌握ColorUI:打造高颜值小程序的终极色彩解决方案
15分钟掌握ColorUI:打造高颜值小程序的终极色彩解决方案 【免费下载链接】coloruicss 鲜亮的高饱和色彩,专注视觉的小程序组件库 项目地址: https://gitcode.com/gh_mirrors/co/coloruicss 还在为小程序界面设计而烦恼吗?ColorUI色彩系…...
Windows下用Python调用CDS API下载ERA5数据,报错Missing/incomplete configuration?手把手教你创建.cdsapirc配置文件
Windows下Python调用CDS API下载ERA5数据报错排查指南:从配置文件创建到隐藏文件陷阱全解析 当你在Windows系统上首次尝试使用Python调用CDS API下载ERA5气象数据时,可能会遇到一个令人困惑的报错:"Missing/incomplete configuration f…...
