1. 基于UDP的TFTP文件传输

news2024/12/30 1:32:16

 

1)tftp协议概述

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

特点:

是应用层协议

基于UDP协议实现

数据传输模式

octet:二进制模式(常用)

mail:已经不再支持

2)tftp下载模型

TFTP通信过程总结

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

3)tftp协议分析

差错码:

0 未定义,差错错误信息

1 File not found.

2 Access violation.

3 Disk full or allocation exceeded.

4 illegal TFTP operation.

5 Unknown transfer ID.

6 File already exists.

7 No such user.

8 Unsupported option(s) requested.

 一部分下载功能能

#include <head.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PORT 69
#define MAXSIZE 516
int download(int cfd,struct sockaddr_in sin);

int main(int argc, const char *argv[])
{
	printf("请输入服务器的IP地址: ");
	char ip[15];
	scanf("%s",ip);
	getchar();
	//创建报式套接字
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	//	printf("sfd = %d\n",cfd);

	//填充服务器自身的地址信息结构体,真是的地址信息结构体根据地址
	//AF_INET :man 7 ip 
	//
	//填充服务器的地址信息结构体,给sendto函数使用
	//要发给谁就填充谁的地址
	struct sockaddr_in sin;
	sin.sin_family      = AF_INET;       //必须填AF_INET
	sin.sin_port        = htons(PORT);   //端口号:服务器绑定的端口号
	sin.sin_addr.s_addr = inet_addr(ip); //IP:服务器绑定的IP

	//设置允许端口被快速复用
	//    printf("允许端口快速重用成功\n");
	//绑定服务器的地址信息结构体到套接字上--->非必须绑定
	//若不绑定,随机端口

	download(cfd,sin);
	close(cfd);
	return 0;
}
int download(int cfd,struct sockaddr_in sin)
{
	char buf[MAXSIZE] = "";
	char str1[128] = "";
	printf("请输入要下载的文件: ");
	scanf("%s",str1);
	getchar();
	//打包数据组
	char *ptr = buf;
	unsigned short *p1 = (unsigned short*)buf;
	*p1 = htons(1);
	char *p2 = buf + 2;
	strcpy(p2,str1);
	char *p3 = p2 + strlen(p2)+1;
	strcpy(p3,"octet");
	//计算大小
	int size =2+strlen(str1)+7;
	//发送数据
	if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin)) < 0) 
	{
		ERR_MSG("sendto");
		return -1;
	}
	int fp = open(str1,O_RDWR|O_CREAT|O_TRUNC,0664);
	if(fp < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	ssize_t res = 0;
	//存储接收到的数据包从哪里来
	socklen_t addrlen = sizeof(sin);
	while(1)
	{
		//接受数据
		bzero(buf,sizeof(buf));
		//res = recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);

		res = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);
		if(res < 0)
		{
			ERR_MSG("recvfrom");
			break;
		}
		if(write(fp,buf+4,res-4) < 0)
		{
			ERR_MSG("write");
			break;
		}
		printf("buf[1] = %d res = %ld\n",buf[1],res);
		buf[1] = 4;
		if(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin)) < 0) 
		{
			ERR_MSG("sendto");
			return -1;
		}
		if(res<516)
		{
			printf("文件下载完毕\n");	
			break;
		}
	}
	//关闭文件描述符
	close(cfd);
	return -1;
}

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

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

相关文章

Python实现GA遗传算法优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

串口通信收发项目级一

void 定时器中断函数入口(void) { if(判断是否为定时器中断) { static uint16_t num定义静态变量; static uint8_t index定义静态变量; unsigned char buff_busy定义局部变量; if(串口中断接收数据数量>静态变量) { 静态变量串口中断接收数据数量; } else if(静态变量串口中…

day41二维数组 *returnSize 和 *returnColumnSizes +合并两个二维数组

题目描述&#xff1a; 题目参数 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ int** m…

七 动手学深度学习v2 ——数值稳定性+模型初始化和激活函数

1. 数值稳定性 2. 如何让训练更加稳定 目标&#xff1a;让梯度值在合理的范围内 方法&#xff1a; 将乘法变成加法 ResNetLSTM 归一化 梯度归一化梯度裁剪 合理的权重初始和激活函数

python 画三维散点图

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from mpl_toolkits.mplot3d import Axes3D # 空间三维画图def get_color(label):label_color []for i in range(0,len(label)):if label[i] 0:label_color.append(red)elif l…

SpringBoot3安全管理

标签&#xff1a;Security.登录.权限&#xff1b; 一、简介 SpringSecurity组件可以为服务提供安全管理的能力&#xff0c;比如身份验证、授权和针对常见攻击的保护&#xff0c;是保护基于spring应用程序的事实上的标准&#xff1b; 在实际开发中&#xff0c;最常用的是登录验…

BC136 KiKi去重整数并排序

给定一个整数序列&#xff0c;KiKi想把其中的重复的整数去掉&#xff0c;并将去重后的序列从小到大排序输出。 输入描述 第一行&#xff0c;输入一个整数n&#xff0c;表示序列有n个整数。 第二行输入n个整数&#xff08;每个整数大于等于1&#xff0c;小于等于1000&#xf…

Azure资源命名和标记决策指南

参考 azure创建虚拟机在虚拟机中选择编辑标签&#xff0c;并添加标记&#xff0c;点击应用 3.到主页中转到所有资源 4. 添加筛选器并应用 5.查看结果&#xff0c;筛选根据给服务器定义的标签筛选出结果。 参考链接: https://learn.microsoft.com/zh-cn/azure/cloud-adoption…

Java接口压力测试—如何应对并优化Java接口的压力测试

导言 在如今的互联网时代&#xff0c;Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量&#xff0c;用户体验将受到严重影响&#xff0c;甚至可能导致系统崩溃。因此&#xff0c;了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…

3张照片打造专属形象!酷蛙FaceChain解密个人写真开源项目,人人AIGC!

一、背景说明 各类AI写真软件由于其精准的个人形象精美的生成效果引爆了朋友圈传播&#xff0c;证件照满足了用户刚需&#xff0c;古装照等风格照满足了用户“美照”的需求。 酷蛙FaceChain开源项目团队推出了开源版本&#xff0c;希望结合开源社区开发者的力量&#xff0c;可…

Linux之openoffice安装

一、openoffice简介 OpenOffice是一个开源的办公软件套件&#xff0c;包含了文本编辑器、电子表格、演示文稿、数据库和绘图等应用程序。它可以在多个操作系统上运行&#xff0c;包括Windows、Mac OS X和Linux等。OpenOffice的目标是提供一个完全免费、功能齐全的办公软件套件&…

【LeetCode】【数据结构】栈与队列必刷OJ题

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言&#xff1a; 【LeetCode】20.有效的括号&#xff08;栈的…

1289. 下降路径最小和 II

题目描述&#xff1a; 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;且按顺序选出来的数字中&#xff0c;相邻数字不在原数组的同一列。 示例&am…

企业级备份 - 让您的数据安全防线坚韧如山

产品定义 数据威胁无处不在&#xff0c;不论数据处于何地&#xff0c;以何种形态体现&#xff0c;数据安全都至关重要。备份作为数据安全的最后一道防线&#xff0c;需要慎之又慎。针对数据备份与恢复的企业级应用&#xff0c;联想凌拓 (Lenovo NetApp) 与华睿泰 (Veritas) 共同…

【C++】速识string

一、创建string对象 1、文档 2、常用 并不是所有的用法都需要熟记于心&#xff0c;我们只需记住常用的即可&#xff0c;对于并不常用的&#xff0c;我们可以在用到的时候查看文档学习使用。 void Test1() {string s1;string s2("Hello World");s1 "Hello …

Android 10.0 禁止二次展开QuickQSPanel设置下拉QSPanel高度

1.前言 在10.0的系统定制化需求中,在进行systemui的ui定制开发中,有些需要对原生systemui下拉状态栏中的二次展开QSPanel修改成 一次展开禁止二次展开,所以就需要修改QuickQSpanel的高度,然后在QuickQsPanel做定制,然后禁止二次展开就可以了 如图: 2.禁止二次展开Quic…

ubuntu下FFmpeg安装和使用以及CMakeLists.txt模板

sudo apt install ffmpeg sudo apt-get install libavfilter-devcmakelist模板 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录&#xff0c;并存进指定变量 set(ffmpeg_libs_DIR /usr/lib/x86_64-linux-gnu) …

【Windows 常用工具系列 7 -- 禁用win10自带的微软输入法】

文章目录 1.1 输入法配置 1.1 输入法配置 首先建议采用搜狗输入法&#xff0c;这个更符合中国人的输入习惯&#xff0c;强烈建议删除微软自带的中文输入法&#xff0c;删除方式见&#xff1a; 点击电脑主屏幕左下角开始图标&#xff0c;选择设置&#xff1a; 选择“时间和语…

AutoxJS脚本保姆级教程

目录 引言 准备工作 脚本开发 邮件提示&#xff08;不使用邮件推送的可以跳过这步&#xff09; 节假日判断&#xff08;不需要判断节假日的可以跳过&#xff09; 问题及技巧归总 JS语法错误&#xff1a;软件更新 按钮或组件无法找到 使用定时器等待组件出现 root环境下…

Scratch 之 单个角色模糊特效

想给单独一个角色用模糊特效&#xff0c;怎么办&#xff01;&#xff01;&#xff01; 完全不用慌&#xff0c;最近&#xff0c;我做出了超好用的个体模糊特效&#xff0c;用起来超级简单&#xff0c;接下来进入讲解。 1.原理 前几天&#xff0c;我闲来无事&#xff0c;摘下眼镜…