华清远见嵌入式学习——网络编程——作业3

news2025/1/13 11:56:11

目录

作业要求:基于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;
			}
 
			//构造ACK
			buf[1] = 4;
			//发送ACK
			if(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;
		}
 
		//判断是否接收到服务器发来的ACK
		if(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;
}

下载功能效果图

上传功能效果图

思维导图

(从第二章到第五章)

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

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

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

相关文章

CSS特效016:天窗扬起合上的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

在PyCharm中正确设置Python项目

大家好&#xff0c;在Mac和Linux都支持Python&#xff0c;但许多开发者发现正确设置Python项目很困难。本文汇总了多平台中运行Python的方法&#xff0c;提高编程的效率&#xff0c;如下所示&#xff1a; 使用命令行运行Python。 在PyCharm&#xff08;免费社区版&#xff09;…

微信小程序蓝牙连接 uniApp蓝牙连接设备

蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…

java基础-集合

1、集合 在java中&#xff0c;集合&#xff08;Collection&#xff09;指的是一组数据容器&#xff0c;它可以存储多个对象&#xff0c;并且允许用户通过一些方法来访问与操作这些对象。j 集合的实现原理都基于数据结构和算法&#xff0c;如下&#xff1a; 数据结构&#xff1…

[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

Redis-Redis缓存高可用集群

1、Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可…

深度学习图像修复算法 - opencv python 机器视觉 计算机竞赛

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

Kubernetes(k8s)之Pod详解

文章目录 Kubernetes之Pod详解一、Pod介绍pod结构pod定义 二、Pod配置pod基本配置镜像拉取策略启动命令环境变量端口设置资源配额 三、Pod生命周期创建和终止初始化容器钩子函数容器探测重启策略 四、Pod调度定向调度NodeNameNodeSelector 亲和性调度NodeAffinityPodAffinityPo…

【11月比赛合集】48场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;9场比赛&#xff09;阿里天池&#xff08;…

Visual Studio连接unity编辑器_unity基础开发教程

Visual Studio连接unity编辑器 问题描述解决方法意外情况 问题描述 当我们在unity编辑器中打开C#脚本的时候发现Visual Studio没有连接unity编辑器&#xff0c;在编写代码的时候也没有unity关键字的提醒。 简单来说就是敲代码没有代码提示。 解决方法 这时候需要在unity中进行…

nodejs微信小程序+python+PHP-储能电站运营管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

MS9708/MS9710/MS9714高速、低功耗数模转换器,可替代ADI的

产品简述 MS9708/MS9710/MS9714 是一个 8-Bit/10-Bit/14-Bit 高速、低功耗 D/A 转换器。当采样速率达到 125MSPS 时&#xff0c; MS9708/MS9710/MS9714 也能提供优越的 AC 和 DC 性能。 MS9708/MS9710/MS9714 的正常工作电压范围为 2.7V 到 5.5V &#xff0c;…

供应链和物流的自动化新时代

今天&#xff0c;当大多数人想到物流自动化时&#xff0c;他们会想到设备。机器人、无人机和自主卡车运输在大家的谈话中占主导地位。全自动化仓库的视频在网上流传&#xff0c;新闻主播们为就业问题绞尽脑汁。这种炒作是不完整的&#xff0c;它错过了供应链和物流公司的机会。…

【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)&#xff1f; 独立成分分析简单来说&#xff0c;就是给定很多的样本X&#xff0c;通…

BLE通用广播包

文章目录 1、蓝牙广播数据格式2、扫描响应数据 1、蓝牙广播数据格式 蓝牙广播包的最大长度是37个字节&#xff0c;其中设备地址占用了6个字节&#xff0c;只有31个字节是可用的。这31个可用的字节又按照一定的格式来组织&#xff0c;被分割为n个AD Structure。如下图所示&…

微机原理_1

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 1,下列8086CPU标志寄存器的标志位中,不属于状态标志位的是(&#xff09; A. OF B. IF C. AF D. PF 8086微处理器可寻址访问的最大…

通过Everything 建立HTTP服务器时指定文件夹共享

在局域网传输文件&#xff0c;高效传输&#xff0c;不限文件大小 1、安装Everything 2、在Everything开启HTTP服务 【工具】—>>【选项】—>>【HTTP服务】启用HTTP服务器&#xff0c;设置HTTP服务器用户名和密码 3、查看网络信息 打开服务端电脑的【命令提示…

基于SSM的课程资源管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【JVM精讲与GC调优教程(概述)】

如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…

java--飞翔的小鸟

游戏玩法&#xff1a;通过鼠标点击使小鸟上下移动穿过柱子并完成得分&#xff0c;小鸟碰到柱子或掉落到地面上都会结束游戏。 游戏内图片 Brid类&#xff1a; package bird;import org.omg.CORBA.IMP_LIMIT;import javax.imageio.ImageIO; import java.awt.image.BufferedIma…