网络编程day3作业

2023-11-02

tftp下载:

#include <myhead.h>
#define PORT 69 //目标端口号,范围1024~49151
#define IP "192.168.114.53"//目标IP

int do_download(int cfd, struct sockaddr_in sin);

int main(int argc, const char *argv[])
{
	//1、创建报式套接字
	int cfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(cfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}

	printf("socket creat success cfd=%d\n",cfd);
	//填充服务器的地址信息结构体,
	//真实的地址信息结构体根据地址族指定,AF_INET
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);//目标的端口号网络字节序1024-49151
	sin.sin_addr.s_addr = inet_addr(IP);//目标IP

	char choose = 0;
	while(1)
	{
		system("clear");
		printf("**************************\n");
		printf("***********1.下载*********\n");
		printf("***********2.上传*********\n");
		printf("***********3.退出*********\n");
		printf("**************************\n");
		printf("请输入>>>");
		scanf("%c",&choose);
		while(getchar() != 10);//循环吸收垃圾字符
		switch(choose)
		{
			case '1':
				do_download(cfd,sin);
				break;
			case '2':
				//do_upload()
				break;
			case '3'://退出
				goto END;
				break;
			default:
				printf("输入错误,请重新输入\n");

		}
		printf("输入任意字符清屏>>>");
		while(getchar() != 10);
	}


END:
	//关闭
	close(cfd);

	return 0;
}
//下载函数
int do_download(int cfd, struct sockaddr_in sin)
{
	char filename[20]="";
	printf("请输入文件名>>>");
	scanf("%s",filename);
	while(getchar() != 10);
	//组下载请求包
	char buf[516] = "";
	unsigned short* ptr1 = (unsigned short*)buf;//操作码
	*ptr1 = htons(1);

	char* ptr2 = buf+2;
	strcpy(ptr2,filename);//文件名
	
	char* ptr4 = ptr2 +strlen(filename)+1;//操作模式
	strcpy(ptr4,"octet");

	int size = 2+strlen(ptr2)+1+strlen(ptr4)+1;
	//发送下载请求包 sendto
	if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
	{
		ERR_MSG("sendto");
		return -1;
	}
	printf("sendto download request success\n");

	int fd = -1;//定义一个文件描述符操控被写入的文件

	socklen_t addrlen = sizeof(sin);	
	ssize_t res = 0;
	unsigned short num = 0;//记录本地的块编号

	while(1)
	{
		//接收数据 recvfrom,接收地址信息
		if((res=recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen))<0)
		{
			ERR_MSG("recvfrom");
			return -1;
		}

		if(3 == buf[1])//数据包
		{
			if(*(unsigned short*)(buf+2) == htons(num+1))
			{
				num++;//更新本地记录的块编号
				if(-1 == fd)
				{
					if((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664)) < 0)
					{
						ERR_MSG("open");
						return -1;;
					}	
				}

				//将收到的数据写入文件
				if(write(fd, buf+4, res-4) < 0)
				{
					ERR_MSG("write");
					close(fd);
					return -1;
				}

				//发送ACK
				buf[1]=4;
				if(sendto(cfd, buf, 4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
				{
					ERR_MSG("sendto");
					return -1;
				}

				if(res-4 < 512)//数据小于512 则下载完成
				{
					printf("%s 下载完毕\n",filename);
					break;
				}

			}
		}
		else if(5 == buf[1]) //错误包
		{
			printf("错误: %d %s\n", ntohs(*(short*)(buf+2)), buf+4);
			close(fd);
			return -1;
		}
	}

	close(fd);
	return 0;
}


//int do_upload()

思维导图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程day3作业 的相关文章

随机推荐

  • Chrome for Mac(谷歌浏览器MAC版)提示您的连接不是私密连接,没有继续访问选项解决方法

    Chrome for Mac 谷歌浏览器MAC版 提示您的连接不是私密连接 没有继续访问选项解决方法 问题描述 解决方案 问题描述 访问https的一些网站时 由于证书过期或者种种原因提示 您的连接不是私密连接 通常来说如果充分信任改网站可
  • 游戏场景设计案例精选

    现在我们来讨论一下如何将游戏场景从概念转变为现实 示例场景来自于我2010 年开发的游戏 火星基地 的 游戏的主角汉娜 Hannah 由于宇宙飞船的宝石燃料耗尽而降落在火星 汉娜必须在这个文明的废墟中找到替代的宝石以逃离困境 废墟的文明只是
  • python可视化库以及常见的可视化工具

    因为工作学习需要 日常需要辅助画一些图形 为便于后续方便查找 故整理下相关常见库和工具 首先介绍python可操作性的库 1 matplotlib 这个差不多是把matlab中可以画出的图形 全部迁移到python中 通过python代码就
  • JAVA语言多线程的执行

    这里写目录标题 1 关于多线程的介绍与执行 1 1什么是线程 什么是进程 2 2进程和线程是什么关系 3 3主栈与其它栈的关系 4 4单核cpu和多核cpu 5 5run 和start 的作用和关系 6 6线程的个数判别 7 7实现线程的两
  • Servlet(Servlet的体系结构, Servlet相关配置)

    Servlet的体系结构 Servlet 接口 GenericServlet 抽象类 HttpServlet 抽象类 GenericServlet 将Servlet接口中其他的方法做了默认空实现 只将service 方法作为抽象 将来定义S
  • AGV小车修改地图匹配得分

    用NoMachine连接小车进入工控机内部 在路径 Home okagv2020 install share cartographer ros configuration files 下找到backpack 2d navigation lu
  • 读的一些书

    读书 乖 摸摸头 阿弥陀佛 么么哒 梦的解析 梦的产生 梦的来源 梦的内容 孩提的梦 梦的表现方法 梦的遗忘 活出生命的意义 找寻生命意义的三个途径 意义 集中营中 囚徒 的心理阶段 自我保全的法则 非暴力沟通 由衷的给予 交流 非暴力沟通
  • QT 信号和信号槽

    信号和信号槽机制 signal slot 是Qt的编程基础 是用来在QObject类或其子类间通讯的方法 作为一种通用的处理机制 信号与信号槽非常灵活 可以携带任意数量的参数 参数的类型也由用户自定 同时其本身也是类型安全的 任何一个从QO
  • 和微软合作的garagegames公司推出基于XNA的游戏引擎TorqueX,支持快速开发(近期引擎免费提供使用)

    我们都知道微软的XNA明年就要推出正式版本 在正式版本里将开始直接支持3D的开发 而XNA的3D低层引擎使用的是garagegames公司开发的游戏引擎 garagegames以开发TORQUE系列游戏引擎出名 TORQUE引擎包括2D的T
  • c语言库函数fgets,C语言 标准I/O库函数 fgets 使用心得

    char fgets char s int n FILE stream 参数说明 s 指定存放所读取的数据的位置 n 指定所读取数据的最大长度 这个最大长度包括了字符串结束符 0 所占据的存储空间 因此 实际最大读取的有效字符数是 n 1
  • Oracle PL/SQL 高级编程

    1 复合数据类型 记录类型 语法格式 type 类型名 is record 字段1 字段1类型 not null 表达式1 字段2 字段2类型 not null 表达式2 说明 记录之间相互赋值要求两个记录类型完全相同 案例 举例1 创建表
  • 三维重建(三)相机参数标定与光束平差法(Bundle Adjustment)

    一 针孔成像模型涉及到的坐标系 由于相机的参数总数相对于某种光学模型而言的 这里用到的比较广泛的光学模型就是小孔成像的模型 下面针对小孔成像的光学模型涉及到的坐标系一一介绍 1 世界坐标系 世界坐标系即为三维空间中物体的坐标 用 Xw Yw
  • MES系统是什么

    前言 通俗的来讲 MES系统是一个辅助规范管理的系统 但是我总觉得这样很抽象 达不到一个很好的效果 所以 我打算从业务开始完整的介绍一下MES系统到底是什么 从业务开始 MES系统是什么 在电路板的生产过程中 有很多地方需要进行管理 从开始
  • @程序员,你在颓丧的时候怎么办?

    01 颓丧的感觉 颓丧 一般指精神萎靡不振 情绪消沉 多用于消极的人身上 有时候也用于别处 比如说 红楼梦 第七六回中就有一句 因又叹道 诗固新奇 只是太颓丧了些 不管怎么说 这个词相关的主题很少会在朋友圈看到 因为人们需要树立积极向上的正
  • JAVA操作Elasticsearch指定主键_id生成策略

    目录 前言 1 JAVA操作Elasticsearch手动指定ID 2 JAVA操作Elasticsearch自动生成ID 3 DSL方式手动指定ID 4 DSL方式自动生成ID 前言 Elasticsearch一共有两种主键生成策略 一个
  • Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on

    报错信息 Failed to execute goal org apache maven plugins maven surefire plugin 2 22 1 test default test on project qc offlin
  • 神经元是多输入单输出吗,单输入单输出神经网络

    1 人工神经网络的知识表示形式 人工神经网络的知识表示形式 1 每个神经元都是一个多输入单输出的信息处理单元 2 神经元输入分兴奋性输入和抑制性输入两种类型 3 神经元具有空间整合特性和阈值特性 4 神经元输入与输出间有固定的时滞 主要取决
  • 关于博客积分规则,总是找不着入口

    博客积分规则 博客积分是CSDN对用户努力的认可和奖励 也是衡量博客水平的重要标准 博客等级也将由博客积分唯一决定 积分规则具体如下 1 每发布一篇原创或者翻译文章 可获得10分 2 每发布一篇转载文章 可获得2分 3 博主的文章每被评论一
  • 微信小程序从入坑到放弃二十五:记一次在WXS中使用正则表达式的坑

    摘要 WXS WeiXin Script 是小程序的一套脚本语言 结合 WXML 可以构建出页面的结构 在此次开发中 由于接口返回数据不统一 所以要对某些字段进行过滤 但直接使用replace时竟然报错了 原来在WXS中要生成regexp对
  • 网络编程day3作业

    tftp下载 include