基于UDP的TFTP文件传输
代码:
#include <myhead.h>//实现下载功能
int download(int cfd,struct sockaddr_in sin)
{char buf[516] = ""; //定义资源包char fileName[128] = ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName); getchar();//打开文件int fd = -1;if((fd = open(fileName,O_RDWR|O_CREAT|O_TRUNC|0666)) == -1){perror("open error"); //读写形式创建文件,文件名为输入的文件名return -1;}//组装请求包short *p1 = (short *)buf;*p1 = htons(1);char *p2 = buf + 2;strcpy(p2,fileName);char *p3 = p2+strlen(p2)+1;strcpy(p3,"octet"); int size = 4+strlen(p2)+strlen(p3); //整体长度//先发送下载请求到服务器if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("请求成功!\n");socklen_t socklen = sizeof(sin);char *p5 = buf + 4; //确定数据的位置以及差错信息的位置while(1){bzero(buf,sizeof(buf));int res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);int A = buf[1]; //因为小端存储,操作码放在buf的第二位if(A == 3) //当操作码为3时,证明是数据包,正常接收{write(fd,p5,sizeof(buf));buf[1]=4; //将操作码改为4,即ACK//将buf前四位发送回去,因为操作码已经修改,发回去四位当做ACK回复sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin));}else if(A == 5) //当操作码为5时,证明为ERROR{printf("%s\n",p5);return -1;}if(res < 516) //当接收到的字节数小于516时,证明已经接收完成,关闭循环break;}printf("下载完成\n");close(fd); //关闭文件
}//实现上传功能
int upload(int cfd,struct sockaddr_in sin)
{char buf[516] = ""; //定义资源包char fileName[128] = ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName); getchar();//打开文件int fd = -1;if((fd = open(fileName,O_RDONLY)) == -1){perror("open error"); //只读形式打开文件,文件名为输入的文件名return -1;}//组装请求包short *p1 = (short *)buf;*p1 = htons(2); //操作码为2代表要上传char *p2 = buf + 2;strcpy(p2,fileName);char *p3 = p2+strlen(p2)+1;strcpy(p3,"octet"); int size = 4+strlen(p2)+strlen(p3); //整体长度//先发送上传请求到服务器if(sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("请求成功!\n");socklen_t socklen = sizeof(sin);int n = 1;while(1){bzero(buf,sizeof(buf));recvfrom(cfd,buf,4,0,(struct sockaddr*)&sin,&socklen);int res = read(fd,buf+4,sizeof(buf)-4); //将文件的512位写入数据包buf[1]=3; //将操作码改为3,即数据包//将buf发送,因为操作码已经修改,发回去数据加上了操作码和块编号sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));if(res==0) //证明已经上传完成,关闭循环break;}printf("上传完成\n");close(fd); //关闭文件}
int main(int argc, const char *argv[])
{if(argc != 2){printf("input error");return -1;}//创建套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd == -1){perror("socket error");return -1;}//填充服务器结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(69);sin.sin_addr.s_addr = inet_addr(argv[1]);int key = 0;while(1){system("clear");printf("\t\t菜单\t\t\n");printf("\t\t1.下载\t\t\n");printf("\t\t2.上传\t\t\n");printf("\t\t0.关闭\t\t\n");printf("请输入选项:");scanf("%d",&key);getchar();switch(key){case 1:{//下载int A =download(cfd,sin);};break;case 2:{//上传int B =upload(cfd,sin);};break;case 0:{goto A;};break;default:printf("请输入正确的选项!\n");}//阻塞printf("输入任意键,按回车清空");while(getchar() != '\n');}A:close(cfd);return 0;
}
上传文件
下载文件
相关文章:

基于UDP的TFTP文件传输
代码: #include <myhead.h>//实现下载功能 int download(int cfd,struct sockaddr_in sin) {char buf[516] ""; //定义资源包char fileName[128] ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName…...
抵御代码重用攻击:指针认证(PAC)和分支目标识别(BTI)
目录 一、代码重用攻击历史 二、小工具(Gadgets):它们是什么?为什么它们很危险? 三、ROP攻击...

业务逻辑漏洞
业务逻辑漏洞 扫描器扫不出来 漏洞包括 暴力破解任意用户/密码登陆短信/邮箱轰炸验证码绕过/爆破/重放/回传用户名/手机号枚举(用户名枚举:当用户登录时,显示用户名不存在,或密码不正确,两个其中一个不正确就称为用户名枚举)越…...

Vue框架学习笔记——计算属性
文章目录 前文提要代码需求描述插值语法实现methods实现 计算属性getter执行时间:setter 计算属性简写形式(只读不改,才能如此简写)slice截取元素,限制输入字符数量 前文提要 本人仅做个人学习记录,如有错…...

初识PO模式并在Selenium中简单实践
初识PO模式 PO(PageObject)是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中,通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前,可以先…...
读书笔记:彼得·德鲁克《认识管理》第35章 以任务和工作为中心的设计
一、章节内容概述 如今我们已经拥有五种不同的组织设计原则,其中每一种都能够满足若干设计规范,但任何一种都不能满足所有规范;其中每一种都有自身的优势、劣势和对效果的严格要求,都蕴含着特定的组织设计逻辑。其中前两种设计原则ÿ…...
算法基础课 (一) 基础算法
进制转换 #include<iostream> using namespace std; const int N 100; int n,m; string s; int x;//记录n进制转化成十进制; int ans[N]; int main(){cin>>n>>s>>m;int t1;for(int is.size()-1;i>0;i--){if(s[i]<A){x t*(int)(s[i]-0);t * n;…...

【Python】jieba分词基础
jieba分词主要有3种模式: 1、精确模式:jieba.cut(文本, cut_allFalse) 2、全模式:jieba.cut(文本, cut_allTrue) 3、搜索引擎模式:jieba.cut_for_search(文本) 分词后的关键词提取: jieba.analyse.textrank(txt,t…...

使用jmeter对接口进行简单测试
JMeter是一个开源的性能测试工具,它可以对于Web应用程序、FTP、数据库服务器等各种服务器进行性能测试和负载测试,以确定它们是否能够承受预期的负载。JMeter支持多种协议和技术,如HTTP、HTTPS、FTP、JDBC、LDAP、SOAP、JMS等。它使用Java编写…...

成长在于积累——https 认证失败的学习与思考
1. 引言 本周二长城项目在收尾过程中,出现了一个车端无法进行注册的问题:curl提示证书认证失败(其实已经能确认问题方向了,运维人员去确认证书问题即可)。虽然最终的原因是由于长城运维人员导致的。但是这个过程让我颇…...

C语言——数字金字塔
实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格,空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…...
关于 typedef 的用法
typedef 是 C 和 C 语言中的关键字,用于创建类型的别名。它的主要作用是给一个已有的类型定义一个新的名称,以提高代码的可读性和可维护性。下面是 typedef 的几种常见用法: 用于给基本类型定义别名: typedef int myint;上述代码…...

Webshell流量分析
Webshell流量分析 常见的一句话木马: asp一句话 <%eval request("pass")%> aspx一句话 <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> php一句话 <?php @eval($_POST["pass&…...

高级IO—poll,epoll,reactor
高级IO—poll,epoll,reactor 文章目录 高级IO—poll,epoll,reactorpoll函数poll函数接口poll服务器 epollepoll的系统调用epoll_createepoll_ctlepoll_wait epoll的工作原理epoll的工作方式水平触发边缘触发 epoll服务器 reactor poll函数 poll函数是一个用于多路复用的系统调…...

一文详解Python中常用数据类型
文章目录 Python 中常用的数据类型包括:Python 中布尔类型(bool)Python 中的数字类型概述Pyhon中的字符串概述Python 中的List概述Python 中的元组类型(tuple)Python中的字典(Dictionary)Python中的集合(Set)Python中的…...

【MATLAB源码-第85期】基于farrow结构的滤波器仿真,截止频率等参数可调。
操作环境: MATLAB 2022a 1、算法描述 Farrow结构是一种用于实现可变数字滤波器的方法,尤其适用于数字信号处理中的采样率转换和时变滤波。它通过多项式近似来实现对滤波器系数的平滑变化,使得滤波器具有可变的群延时或其他参数。 Farrow结…...

ChatGPT Plus/GPT4高级数据分析和插件功能详解
ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导,提高编程效率和准确性。此外,ChatGPT是一位出色的合作伙伴,可以为您提供论文写作的…...

【Android Jetpack】Room数据库
文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects(DAOs)使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …...
自定义中间件
1.使用 app.use0来定义全局生效的中间件 // 导入 express 模块 const express require(express) // 创建 express的服务器实例 const app express() app.use(function(req, res, next) {// 中间件的业务逻辑 }) 2.监听 req 的 data 事件 在中间件中,需要监听 re…...
优化机器学习:解析数据归一化的重要性与应用
在机器学习中,数据归一化是一种数据预处理的技术,旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异,以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常,机器…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...