华清远见嵌入式学习——网络编程——作业3
目录
作业要求:基于UDP的TFTP文件传输
代码
下载功能效果图编辑
上传功能效果图
思维导图
模拟面试题和答案(定期更新)
作业要求:基于UDP的TFTP文件传输
完成文件的上传和下载功能
代码
#include<myhead.h>//实现下载功能
int do_download(int cfd, struct sockaddr_in sin)
{//定义变量存储下载请求包char buf[516] = "";//定义变量存储文件名char fileName[40] = "";printf("请输入文件名:");scanf("%s", fileName);getchar();//组装请求包short *p1 = (short *)buf;*p1 = htons(1); //写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);//打开一文件接受下载文件int fd = open(fileName,O_RDWR|O_TRUNC|O_CREAT,0666);if(fd<0){perror("open error");return -1;}int res;while(1){//接受数据包bzero(buf,sizeof(buf));res = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);if(res<0){perror("recvfrom error");return -1;}if(buf[1]==3){//写入文件if(write(fd,buf+4,res-4)<0){perror("write");return -1;}//构造ACKbuf[1] = 4;//发送ACKif(sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))<0){perror("sendto");return -1;}//判断数据包中的数据大小if(res-4<512){printf("%s 下载完毕\n",fileName);break;}}else if(buf[1]==5){printf("%d %s\n",ntohs(*(short*)(buf+2)),buf+4);break;}}close(fd); return 0;
}//实现上传功能
int do_upload(int cfd,struct sockaddr_in sin)
{//定义变量存储上传请求包char buf[516] = "";//定义变量存储文件名char fileName[40] = "";printf("请输入文件名:");scanf("%s", fileName);getchar();//组装请求包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 fd = open(fileName,O_RDONLY);if(fd<0){perror("open error");return -1;}int res1,res2;int kbh = 1;while(1){//接受数据包bzero(buf,sizeof(buf));res1 = recvfrom(cfd,buf,4,0,(struct sockaddr*)&sin,&socklen);if(res1 < 0){perror("recvfrom error");return -1;}//判断是否接收到服务器发来的ACKif(buf[1]==4){//填充发送的数据包buf[1] = 3;buf[3] = kbh;res2 = read(fd,buf+4,512);if(res2 < 0){perror("read error");return -1;} //向服务器发送数据包if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("sendto error");return -1;}//发一次块编号加一一次kbh++;//循环退出条件if(res2 < 512){close(fd);printf("文件上传完毕\n");break;}}else if(buf[1]==5){printf("%d %s\n",ntohs(*(short*)(buf+2)),buf+4);break;}}return 0;
}
int main(int argc, const char *argv[])
{if(argc != 2){printf("input error\n");printf("usage:./a.out ip\n");return -1;}//1、创建套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(69);sin.sin_addr.s_addr = inet_addr(argv[1]);int menu = -1;while(1){system("clear"); //清屏printf("\t\t======1、下载=======\n");printf("\t\t======2、上传=======\n");printf("\t\t======0、退出=======\n");printf("请输入功能:");scanf("%d", &menu);getchar();//多分支选择switch(menu){case 1:{do_download(cfd, sin);}break;case 2:{do_upload(cfd,sin);}break;case 0:goto POS;default:printf("输入功能有误,请重新输入\n");}//阻塞printf("输入任意键,按回车清空:");while(getchar() != '\n');}POS://关闭套接字close(cfd);return 0;
}
下载功能效果图


上传功能效果图



思维导图
(从第二章到第五章)

模拟面试题和答案(定期更新)

相关文章:
华清远见嵌入式学习——网络编程——作业3
目录 作业要求:基于UDP的TFTP文件传输 代码 下载功能效果图编辑 上传功能效果图 思维导图 模拟面试题和答案(定期更新) 作业要求:基于UDP的TFTP文件传输 完成文件的上传和下载功能 代码 #include<myhead.h>//实现…...
前端学习--React(3)
一、Redux 集中状态管理工具,不需要react即可使用,每个store的数据都是独立于组件之外的 vue小链接:vuex/pinia 基本使用 Redux将数据修改流程分成三个概念,state、action和reducer state - 一个对象 存放我们管理的数据状态 a…...
rotation matrix reflection matrix
文章目录 1. rotation matrix1.1 结论 2. reflection matrix2.1 结论 1. rotation matrix 图像逆时针旋转 θ \theta θ的矩阵 Q r o t a t e [ cos θ − sin θ sin θ cos θ ] (1) Q_{rotate}\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\c…...
Python基础教程: sorted 函数
嗨喽,大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作, sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。 从新排序列表。 👇 👇 👇 更多精彩机密、教程…...
Vue 重写push和replace方法,解决:Avoided redundant navigation to current location
当我们使用编程式路由导航跳转路径时,如果我们两次携带同样的参数进行跳转,会进行页面报错: 那产生这个问题的原因是什么呢? 我们接收并输出调用push方法返回的结果: 会发现这是一个Promise对象 我们都知道ÿ…...
43、vue导出pdf文件,并解决滚动条外内容无法获取的问题
使用插件html2canvas和jspdf插件 下载完两个插件后引入所需要的页面 import html2canvas from "html2canvas" import jsPDF from "jspdf"1、在导出之前将元素的高度或者宽度设置为滚动高度或者宽度,如: el.style.height el.scro…...
牛客 最小公配数 golang版实现
题目请参考: HJ108 求最小公倍数 题解: 在大的数的倍数里面去找最小的能整除另外一个数的数,就是最小公倍数,按照大的来找,循环次数能够降到很少,提升效率 golang实现: package mainimport ("fmt" )func main() {a : …...
用 HLS 实现 UART
用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此,从概念上讲…...
华清远见嵌入式学习——网络编程——作业4
作业要求:①使用IO多路复用中的select函数实现TCP并发服务器客户端 ②使用IO多路复用中的poll函数实现TCP并发服务器的服务器端 一、 代码 #include <myhead.h>#define SERPORT 8888 //服务器端口号 #define SERIP "192.168.114.113"…...
【OpenCV实现图像:制作酷炫的动画效果】
文章目录 概要生成背景图添加点动画添加文本显示小结 概要 首先,通过导入必要的库,包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后,创建图形和轴,初始化点的位置,以及编写初始化函数和更新函数。 初始化函…...
CSS鼠标属性篇
属性名:cursor 功能:设置鼠标光标的样式 属性值: pointer:小手move:移动图标text:文字选择器crosshair:十字架wait:等待help:帮助 eg.html{ cursor: wait;}(此处使用css改…...
交直流一体化电源系统测试步骤详解
交直流一体化电源拥有高度适应性,可以用于不同的电力需求领域。但是为了确保其质量和性能,需要对交直流一体化电源进行各项测试以保证正常工作。本文纳米软件将介绍交直流一体化电源的测试方法,以及如何用交直流一体化电源测试系统进行测试。…...
多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题
先说一下django-apscheduler定时器的使用过程: django-apscheduler基本使用 1.安装django-apscheduler代码如下(示例): pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下(示例)…...
SPS简单对应分析
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...
智能井盖传感器建设信息化时代智慧城市
近年来随着信息技术的快速发展和城市化进程的加速推进,智慧城市的概念逐渐成为现实。作为智慧城市生命线建设中的重要组成部分,智能井盖传感器的应用正在为城市的可持续发展和居民的生活质量提供新的解决方案。 智能井盖传感器能够实时监测井盖状态&…...
安装向量数据库milvus及其Attu
前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…...
量子计算概述
目录 1.量子计算介绍 2.量子计算应用 3.量子计算研究机构 1.量子计算介绍 量子计算是一种遵循量子力学规律调控量子信息单元进行计算的新型计算模式。经典计算使用2进制进行运算,但2进制只有0和1两种状态,而量子计算除了包含0和1两种状…...
校园圈子论坛,交友,帖子内短视频,二手市场,APP小程序H5三端交付,源码交付,支持二开
校园圈子论坛,交友频道,商城,二手市场,活动专区,短视频,从校园生活的方方面面展现出了充满活力和创造力的镜头。这个频道是一个让学生们相互交流、结识新朋友的平台,不仅有交友功能,…...
Request 爬虫的 SSL 连接问题深度解析
SSL 连接简介 SSL(Secure Sockets Layer)是一种用于确保网络通信安全性的加密协议,广泛应用于互联网上的数据传输。在数据爬取过程中,爬虫需要与使用 HTTPS 协议的网站进行通信,这就牵涉到了 SSL 连接。本文将深入研究…...
gin相关操作--一起学习921190764
gin官方文档 https://gin-gonic.com/docs/quickstart/1. 安装 go get -u github.com/gin-gonic/ginhttps://github.com/gin-gonic/gin简单入门 package mainimport ("github.com/gin-gonic/gin""net/http" )func pong(c *gin.Context) {//c.JSON(http.S…...
[APP微信登录] 登录失败:, {“errMsg“:“login:fail 业务参数配置缺失,https://ask.dcloud.net.cn/article/282“,“code“:-7}
在 uni-app 里做 APP 微信登录时,很多人会遇到这个报错。 现象是:uni.login({ provider: weixin }) 直接失败,返回 code: -7,提示“业务参数配置缺失”。 为什么加上 onlyAuthorize: true 就好了? 因为微信登录在 APP …...
MySQL数据库突然变成只读了?别慌,5分钟教你用SET GLOBAL read_only=0搞定
MySQL数据库突然变成只读了?5分钟紧急恢复写入权限指南 问题现象与紧急判断 凌晨三点,你正熬夜赶一个紧急版本上线,突然发现应用日志里爆出一连串刺眼的错误:"The MySQL server is running with the --read-only option so i…...
ES8311音频Codec调试避坑指南:从ID读取失败到回环测试无声的常见问题排查
ES8311音频Codec调试实战:从寄存器配置到波形分析的完整排错手册 当你在深夜的实验室里盯着示波器上那条毫无生气的直线,耳边只有电脑风扇的嗡嗡声——这可能是每个嵌入式工程师调试音频Codec时都经历过的绝望时刻。ES8311作为一款高性价比的音频编解码芯…...
别再乱画UML了!用包图整理你的用例图和类图,让项目结构一目了然
用UML包图重构项目架构:从混乱到清晰的实战指南 当你的代码库膨胀到几十万行,当每次需求变更都引发连锁反应,当新成员需要三个月才能摸清模块边界——是时候重新审视项目的组织结构了。UML包图就像软件架构的GPS导航系统,它能将散…...
别再死记硬背公式了!用MATLAB/Simulink一步步推导SVPWM羊角波生成(附完整仿真模型)
从零构建SVPWM羊角波:MATLAB/Simulink可视化推导实战 电力电子工程师常把SVPWM比作"空间矢量魔术"——六个基本矢量如何组合出完美圆形磁场?羊角波又为何能实现更高电压利用率?本文将用MATLAB/Simulink搭建可视化推导实验室&#x…...
5分钟搞定 小龙虾 AI OpenClaw v2.6.6 一键安装|办公自动化神器
Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,告别复杂配置【含最新安装包】 2026 年开源圈备受关注的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标突破 28 万 ,凭借本地运行 零代码操作 …...
2048游戏AI助手:三步掌握数字合并的终极策略
2048游戏AI助手:三步掌握数字合并的终极策略 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 你是否曾在2048游戏中屡屡失败,眼看就要合成大数字却功亏一篑?现在,一款…...
顺序表 -->增、删、查、改等详细操作
个人主页:流年如梦 专栏:《C语言》 《数据结构》 文章目录一.线性表二.顺序表2.1概念与结构2.2静态顺序表2.3动态顺序表2.3.1动态顺序表结构体2.3.2头文件声明 --> SeqList.h2.3.3源文件实现 --> SeqList.c2.3.3.1初始化2.3.3.2销毁2.3.3.3打印2.3…...
从SMR硬盘到ZNS SSD:聊聊‘叠瓦式’存储思想的跨界与新生
从SMR硬盘到ZNS SSD:存储技术中的"叠瓦式"思想进化史 在存储技术的发展长河中,有一种设计哲学跨越了机械与固态的物理界限,悄然改变了现代数据中心的架构方式。这种被称为"叠瓦式"(Shingled)的存储…...
如何用CheatEngine-DMA插件实现终极内存修改:5步完整指南
如何用CheatEngine-DMA插件实现终极内存修改:5步完整指南 【免费下载链接】CheatEngine-DMA Cheat Engine Plugin for DMA users 项目地址: https://gitcode.com/gh_mirrors/ch/CheatEngine-DMA 在游戏修改和内存分析领域,CheatEngine-DMA插件为D…...
