Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战

news2025/4/20 9:14:57

知识点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与端口码比较
        数据写入文件,并将端口码赋值给num
        ACK 回应服务器 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;
}

代码运行结果

结束

代码重在练习!

代码重在练习!

代码重在练习!

今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏夹关注,谢谢大家!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c# MES生产进度看板,报警看板 热流道行业可用实时看生产进度

MES生产进度看板&#xff0c;报警看板 热流道行业可用实时看生产进度 背景 本软件是给宁波热流道行业客户开发的生产电子看板软件系统 功能 1.录入工艺流程图&#xff08;途程图&#xff09;由多个站别组成。可以手动设置每个工艺站点完成百分比。 2.可以看生成到哪个工…

初识Redis · C++客户端string

目录 前言&#xff1a; string的API使用 set get&#xff1a; expire: NX XX: mset,mget&#xff1a; getrange setrange: incr decr 前言&#xff1a; 在前文&#xff0c;我们已经学习了Redis的定制化客户端怎么来的&#xff0c;以及如何配置好Redis定制化客户端&…

华硕原厂系统枪神9/9p超竟版-WIN11原装开箱出厂系统安装

华硕原厂系统枪神9/9p超竟版-WIN11-24H2-专业工作站版本安装可带F12-ASUSRecovery恢复功能 适用机型&#xff1a; G635LX、G635LW、G835LX、G835LW、G615LW、G615LP、G615LM、G615LH G815LW、G815LP、G815LM、G815LH、G635LR、G835LR、G615LR、G815LR 远程恢复安装&#xff…

CF1016赛后总结

文章目录 前言T1:Ideal GeneratorT2&#xff1a;Expensive NumberT3:Simple RepetitionT4&#xff1a;Skibidi TableT5:Min Max MEXT6:Hackers and Neural NetworksT7:Shorten the Array 前言 由于最近在半期考试&#xff0c;更新稍微晚了一点&#xff0c;还望大家见谅 &#…

QT聊天项目DAY06

1.从git上同步项目 编译测试&#xff0c;编译通过 Post请求测试 测试成功 2. email is 打印有问题&#xff0c;检查 解析结果是存储在jsonResult中的&#xff0c;修改 3. 客户端实现Post验证码请求 3.1 同步Qt客户端项目 检查QT版本&#xff0c;由于我在公司用的还是QT5.12.9…

GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?

文章目录 前言1. GNU和他的工具1.1 gcc与g1.2 gdb 2.Windows的Mingw/MSVC3.LLVM的clang/clang4.Make/CMake 前言 在开始之前我们先放一段Hello World&#xff1a;hello.c #include <stdio.h>int main() {printf("Hello World");return 0; }然后就是一段老生常…

笔记整理五

STP生成树 stp生成树是用于解决二层环路问题的协议。 二层环路为有以下三种&#xff1a; 1.广播风暴 2.MAC地址的偏移&#xff08;每一次循环&#xff0c;都会导致交换机来回刷新MAC地址表记录&#xff09; 3.多帧复制 stp生成树&#xff1a;需要将原本的环型拓扑结构转换…

奥比中光tof相机开发学习笔记

针对奥比中光 tof相机&#xff0c;官方提供的资料如下ProcessOn Mindmap|思维导图 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装&#xff0c;主要实现数据流接收&#xff0c;设备指令控制。下面就其开发适配进行如下总结&#xff1a; &#xff08;1&#xff09;系统配…

【面试向】点积与注意力机制,逐步编码理解自注意力机制

点积&#xff08;dot product&#xff09;两个向量点积的数学公式点积&#xff08;dot product&#xff09;与 Attention 注意力机制&#xff08;Attention&#xff09;注意力机制的核心思想注意力机制中的缩放点积自注意力机制中&#xff0c;谁注意谁&#xff1f; 逐步编码理解…

一个 CTO 的深度思考

今天和一些同事聊了一会&#xff0c;以下是我的观点 我的观点&#xff0c;成年人只能筛选&#xff0c;不能培养在组织中&#xff0c;应该永远向有结果的人看齐。不能当他站出来讲话的时候&#xff0c;大家还要讨论讨论&#xff0c;他虽然拿到结果了&#xff0c;但是他就是有一…

SQL通用语法和注释,SQL语句分类(DDL,DML,DQL,DCL)及案例

目录 SQL通用语法和注释 SQL语句分类&#xff08;DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;TPL&#xff0c;CCL&#xff09; DDL&#xff08;数据定义语言&#xff09; 数据库操作 查询&#xff08;SHOW、SELECT&#xff09; 创建&#xff08;CREAT…

AUTOSAR图解==>AUTOSAR_SWS_KeyManager

AUTOSAR KeyManager详细分析 AUTOSAR 4.4.0 版本密钥与证书管理模块技术分析 目录 1. 概述2. KeyManager架构 2.1 KeyManager在AUTOSAR架构中的位置2.2 架构说明 3. KeyManager模块结构 3.1 模块组件详解3.2 配置项说明 4. KeyManager证书验证流程 4.1 证书验证流程分析 5. Ke…

Jsp技术入门指南【七】JSP动作讲解

Jsp技术入门指南【七】JSP动作讲解 前言一、什么是JSP动作&#xff1f;二、核心JSP动作详解1. jsp:include&#xff1a;动态包含其他页面与<% include %>的区别 2. jsp:forward&#xff1a;请求转发到另一个页面3. jsp:param&#xff1a;为动作传递参数4. jsp:useBean&am…

10软件测试需求分析案例-查询学习信息

用户登录系统后&#xff0c;进入查询学生信息界面&#xff0c;输入查询字段值&#xff0c;点击查询按钮后&#xff0c;展示查询到的学生信息&#xff0c;可以重新输入字段值进行查询。 查询学生信息属于学生信息管理的子菜单&#xff0c;可以根据学号、姓名、性别查询。老师登录…

基于尚硅谷FreeRTOS视频笔记——6—滴答时钟—上下文切换

FreeRTOS滴答 FreeRTOS需要有一个时钟参照&#xff0c;并且这个时钟不会被轻易打断&#xff0c;所以最好选择systick 为什么需要时间参照 就是在高优先级任务进入阻塞态后&#xff0c;也可以理解为进入delay&#xff08;&#xff09;函数后&#xff0c;需要有一个时间参照&…

MCP服务,阿里云百炼,Cline,mysql-mcp-server,MCP通信原理

简介 MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;模型上下文协议&#xff0c;是一种开放标准&#xff0c;用于将AI模型与外部数据源和工具建立安全的双向连接&#xff0c;它就像AI领域的USB-C接口&#xff0c;为AI模型提供了一种标准化方式来连接不同的数…

一个项目中多个Composer的使用方法

composer是依赖管理工具。 有时我们会在一个项目中使用到多个composer&#xff0c;且每个版本不同。 前提&#xff1a;例如项目xyz根目录vendor中存在阿里云的对应代码。我现在需要再composer腾讯云短信发送的SDK。 1、随便找个位置新建文件夹&#xff0c;存储腾讯云短信发送…

MCP 应用案例-网络设备批量管理

案例背景 需求痛点 企业需管理数百台跨地域网络设备&#xff08;交换机/路由器&#xff09;&#xff0c;传统方式存在&#xff1a; 人工SSH登录效率低脚本维护成本高&#xff08;不同厂商CLI语法差异&#xff09;状态监控依赖独立监控系统 解决方案 通过MCP协议构建智能网络…

国产之光DeepSeek架构理解与应用分析02

本专栏 国产之光DeepSeek架构理解与应用分析-CSDN博客 国产之光DeepSeek架构理解与应用分析02-CSDN博客 前置的一些内容理解 GPU TPU NPU的区别&#xff1f; 设计目的 GPU&#xff1a;最初是为了加速图形渲染而设计的&#xff0c;用于处理图像和视频数据&#xff0c;以提供高…

对美团leaf的初步学习

我的项目中使用的雪花算法生成的全局订单号。但是考虑到了雪花算法可能会由于时钟回拨导致生成的全局id重复。于是去研究了美团的leaf服务&#xff1a;Leaf——美团点评分布式ID生成系统 - 美团技术团队&#xff0c;并总结出该文章。 自己项目中的应用 由于对订单表做了分表&…