项目:基于UDP的TFTP文件传输

1)tftp协议概述

简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输

特点:
是应用层协议
基于UDP协议实现
数据传输模式
octet:二进制模式(常用)
mail:已经不再支持
在这里插入图片描述
在这里插入图片描述

TFTP通信过程总结

服务器在69号端口等待客户端的请求
服务器若批准此请求,则使用 临时端口 与客户端进行通信。
每个数据包的编号都有变化(从1开始)
每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包
数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。

3)tftp协议分析

在这里插入图片描述
代码:

#include <head.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet.h>#define PORT 69
#define IP "10.102.145.165"
int main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd < 0){ERRO_MES("socket");return -1;}printf("cfd = %d\n",cfd);//填充服务器的地址信息结构体,给sendto函数使用//发送给谁,就填谁的地址信息struct sockaddr_in sin;sin.sin_family 		= AF_INET; //必须填AF_INETsin.sin_port  		= htons(PORT); //端口号:服务器绑定的端口号sin.sin_addr.s_addr = inet_addr(IP); //IP:服务器绑定的IPchar choose = 0;while(1){printf("*********************\n");printf("********1. 下载******\n");printf("********2. 上传******\n");printf("********3. 退出******\n");printf("*********************\n");printf("请输入>>> ");choose = getchar();while(getchar() != 10); //循环获取字符串直到遇到/n结束循环switch(choose){case '1':do_download(cfd,sin);break;case '2':do_upload;break;case '3':goto END;break;default:printf("输入错误,请重新输入\n");}}
END://关闭文件描述符close(cfd);return 0;
}
int do_download(int cfd,struct sockaddr sin)
{//发送下载请求char buf[516] = "";char name[20] = "";printf("请输入要下载的文件名>>> ");scanf("%s",name);while(getchar()!=10);unsigned short *p1 = (unsigned short*)buf;*p1 = htons(1);char* p2 =buf+2;strcpy(p2, name);char *p = p2+strlen(p2);*p3 = 0;char* p4 = p3+1;strcpy(p4,"octet");int size = 2+strlen(p2)+1+strlen(p4)+1;if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin)) < 0){ERRO_MES("sendto");return -1;}//打开文件,用于存储下载后的文件int fd = -1;  //必须初始化成一个无效的文件描述符socklen_t addrlen = sizeof(sin);ssize_t res = 0;unsigned short num = 0; //记录本地的块编号while(1){bzero(buf,sizeof(buf));//接收数据res = recvfrom(cfd,buf,sizeof(buf).0,(struct sockaddr*)&sin,&addrlen);if(res < 0){ERRO_MES("recvfrom");return -1;}//由于操作码占两个字节,且是大端字节序//所以低字节存储在高地址,高字节存储在低地址//有效操作码,存储在高地址上,即buf[1]的位置if(3 == buf[1]){//判断服务器返回的数据包的块编号与本地记录的块编号是否一致if(*(unsigned short*)(buf+2) == htons(num+1)){num++; //更新本地记录的块编号if(-1 == fd){fd = open(name,O_WRONLY | O_CREAT | O_TRUNC,0664);if(fd < 0){ERRO_MES("open");return -1;}}//将数据写入到文件中if(write(fd,buf+4,res-4) < 0){ERRO_MES("write");close(fd);return -1;}//发送ACK,发送到临时端口buf[1] = 4;if(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin)) < 0){ERRO_MES("sendto");return -1;}//若接收到的数据小于512跳出循环,结束下载if(res-4 < 512){printf("%s 文件下载完毕\n",name);break;}}}else if(5 == buf[1]) //错误包{printf("错误:%d %s\n",ntohs(*(short*)(buf+2)),buf+4);close(fd);return -1;}}close(fd);return 0;
}

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

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

相关文章

分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存

官方文档&#xff1a;https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲&#xff0c;Nginx可以在接收完整的响应后再将其发送给客户端&#xff0c;从而提高性能和效率…

docker版jxTMS使用指南:使用jxTMS采集数据之三

本文是如何用jxTMS进行数据采集的第三部分&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内…

LeetCode 2682. 找出转圈游戏输家

【LetMeFly】2682.找出转圈游戏输家 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-losers-of-the-circular-game/ n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i …

照耀国产的星火,再度上新!

国产之光&#xff0c;星火闪耀 ⭐ 新时代的星火⭐ 多模态能力⭐ 图像生成与虚拟人视频生成⭐ 音频生成与OCR笔记收藏⭐ 助手模式更新⭐ 插件能力⭐ 代码能力⭐ 写在最后 ⭐ 新时代的星火 在这个快速变革的时代&#xff0c;人工智能正迅猛地催生着前所未有的革命。从医疗到金融…

使用老北鼻AI免费GPT对话解决gun make安装和解析iso9660的问题

在学习解析ISO9660镜像文件时&#xff0c;使用了GPT来了解相关的库和gun make编译器的相关知识。这个过程可真是一言难尽&#xff0c;每个问题的回答都模棱两可都需要去证实&#xff0c;不能直接复制粘贴&#xff0c;也不能说GPT的回答一点用也没有&#xff0c;至少GPT给出了一…

自然语言处理从入门到应用——LangChain:记忆(Memory)-[聊天消息记录]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 Cassandra聊天消息记录 Cassandra是一种分布式数据库&#xff0c;非常适合存储大量数据&#xff0c;是存储聊天消息历史的良好选择&#xff0c;因为它易于扩展&#xff0c;能够处理大量写入操作。 # List of contact…

Android 学习笔记:SharedPreferences实现数据的保存和读取

一、概述 1.键值对方式存储 SharedPreferences 是使用键值对的方式来存储数据的。也就是说&#xff0c;当保存一条数据的时候&#xff0c;需要给这条数据提供一个对应的键&#xff0c;这样在读取数据的时候就可以通过这个键把相应的值取出来。 2.支持多种不同的数据类型存储…

使用Vue和jsmind如何实现思维导图的历史版本控制和撤销/重做功能?

思维导图是一种流行的知识图谱工具&#xff0c;可以帮助我们更好地组织和理解复杂的思维关系。在开发基于Vue的思维导图应用时&#xff0c;实现历史版本控制和撤销/重做功能是非常有用的。以下为您介绍如何使用Vue和jsmind插件来实现这些功能。 安装依赖 首先&#xff0c;我们…

day-17 代码随想录算法训练营(19)二叉树 part04

110.平衡二叉树 分析&#xff1a;判断每个节点的左右子树的高度差小于等于1&#xff1b;所以首先需要求左右子树高度&#xff0c;再在父节点进行判断&#xff0c;故此采用后序遍历。 思路&#xff1a;后序遍历二叉树&#xff0c;从底部递归回来时加上高度 class Solution { …

【管理运筹学】第 5 章 | 整数规划 (1,问题提出与分支定界法)

文章目录 引言一、整数规划问题的提出1.1 整数规划的数学模型1.2 整数规划问题的求解 二、分支定界法2.1 分支与定界2.2 基本求解步骤&#xff08;一&#xff09;初始化&#xff08;二&#xff09;分支与分支树&#xff08;三&#xff09;定界与剪枝&#xff08;四&#xff09;…

SpringBoot之HandlerInterceptor拦截器的使用

&#x1f600;前言 本篇博文是关于拦截器-HandlerInterceptor的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

SQL 复习 03

函数与关键字 用法说明round(x, n)四舍五入&#xff0c;x为浮点数&#xff0c;n为保留的位数ceil(x)向上取整floor(x)向下取整truncate(x, n)截断x&#xff0c;n为保留的位&#xff0c;该位之后的数值置零&#xff0c;位数表示示例&#xff1a;321.123&#xff0c;其中小数点前…

Linux 多进程

目录 0x01 linux中特殊的进程 0x02 进程的标识 0x03 创建子进程 0x01 linux中特殊的进程 0号进程&#xff1a;idle进程&#xff0c;系统启动加载的进程1号进程&#xff1a;systemd进程&#xff0c;系统初始化&#xff0c;是所有进程的祖先进程 init2号进程&#xff1a;kthre…

YOLOv5白皮书-第Y6周:模型改进

&#x1f4cc;本周任务&#xff1a;模型改进&#x1f4cc; 注&#xff1a;对yolov5l.yaml文件中的backbone模块和head模块进行改进。 任务结构图&#xff1a; YOLOv5s网络结构图: 原始模型代码&#xff1a; # YOLOv5 v6.0 backbone backbone:# [from, number, module, args]…

每日汇评:黄金在 200 日移动平均线附近似乎很脆弱,关注美国零售销售

1、金价预计将巩固其近期跌势&#xff0c;至 6 月初以来的最低水平&#xff1b; 2、对美联储再次加息的押注继续限制了贵金属的上涨&#xff1b; 3、金融市场现在期待美国零售销售报告带来一些有意义的推动&#xff1b; 周二金价难以获得任何有意义的牵引力&#xff0c;并在…

Mac RN环境搭建

IOS RN ios android原生环境搭建有时候是真恶心&#xff0c;电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限&#xff0c;执行失败。因…

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

OpenSSH 远程升级到 9.4p1

OpenSSH 远程升级到 9.4p1 文章目录 OpenSSH 远程升级到 9.4p1背景升级前提1. 升级 OpenSSL2. 安装并启用Telnet 升级OpenSSH 背景 最近的护网行动&#xff0c;被查出来了好几个关于OpenSSH 的漏洞。这是因为服务器系统安装后&#xff0c;直接使用了系统自带版本的OpenSSH &am…

2023-08-15 linux mipi 屏幕调试:有一个屏幕开机时候不显示,开机后按power 按键休眠唤醒就可以显示。原因是reset gpio 被复用

一、现象&#xff1a;今天更新了一个新版本的buildroot linux sdk &#xff0c;调试两个mipi 屏幕&#xff0c;这两个屏幕之前在其他的sdk都调好了的&#xff0c;所有直接把配置搬过来。但是有一个屏幕可以正常显示&#xff0c;有一个屏幕开机时候不显示&#xff0c;开机后按po…

CentOS防火墙操作:开启端口、开启、关闭、配置

一、基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firewalld 开机启用 &#xff1a; systemctl enable firewalld systemctl是…