网络编程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作业 的相关文章

  • 当错误较多时,Laravel 不会显示错误。这是 Bug?

    重复的https github com laravel framework issues 31123 https github com laravel framework issues 31123 Laravel 版本 6 8 0 6 10
  • 当存在联系时如何为数组分配排名号

    当尝试为数组中存在平局的数值分配排名时 我很难知道从哪里开始 因此 例如 我需要像下面这样转换一个数组 myarray 4 76 34 13 34 到另一个数组中 例如 myarray2 1 5 3 5 2 3 5 基本上 当相同的数字在数
  • 如何为 Lumen 的封闭路线指定路线名称?

    您好 我有以下流明路线 router gt get end function Illuminate Http Request request use router controller router gt app gt make App H
  • 如何在Web服务中传递URL

    我想将此 URL 作为网址中的值传递http localhost h2orn php verify php email emails hash hash但是 我只能在 符号之前传递 我想传递所有 URL 我正在使用java网络服务 代码在这
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • Laravel 5 与 SAML 2 和现有 IDP 集成

    我使用 Laravel 5 我正在尝试将 SAML 2 0 与其集成 我找到了这个包 https github com aacotroneo laravel saml2 https github com aacotroneo laravel
  • 配置 .htaccess 以在 PHP 框架 (Silex) 上工作

    我的 Apache2 本地主机 linux 上有一个工作路径 http localhost lab silex web index php hello name 我想成为 http localhost lab silex hello nam
  • PHP 中的正则表达式:找到第一个匹配的字符串

    我想在非常长的文本中找到第一个匹配的字符串 我知道我可以使用 preg grep 并获取返回数组的第一个元素 但是 如果我只需要第一场比赛 或者我知道提前只有一场比赛 那么这样做效率不高 有什么建议吗 预匹配 http www php ne
  • PHP header() 和 jquery mobile

    我想使用 php header Location newpage php 进行重定向 我没有收到错误 但 Jquery mobile 似乎无法加载目标页面 并且地址栏仍保留旧地址 请问您有什么建议吗 Thanks 尝试添加data ajax
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • 使用 PDO 在 SQLite 中检索单个(且唯一)行的最简单方法

    我有这个 PDO stmt db gt prepare SELECT FROM channels WHERE id id stmt gt bindValue id id SQLITE3 INTEGER result stmt gt exec
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • 将秒转换为天、小时、分钟和秒

    我想转换一个变量 uptime这是秒 分为天 小时 分钟和秒 Example uptime 1640467 结果应该是 18 days 23 hours 41 minutes 这可以通过以下方式实现DateTime http php net
  • 转换MAC地址格式

    我刚刚编写了一个小脚本 从交换机中提取数百个 MAC 地址进行比较 但它们的格式为 0025 9073 3014 而不是标准的 00 25 90 73 30 14 我对如何转换它感到困惑 我能想到的最好的办法就是在 处将它们分解成碎片 然后
  • WordPress 事件按元生效日期排序

    我在获取参数数组以按 Wordpress 中的日期对事件列表进行排序时遇到一些问题 我在 Stack Overflow 和其他地方找到了几个建议的解决方案 但经过大量的试验和错误后 这些解决方案似乎都不起作用 这没什么花哨的 而且应该比这容
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • PHP 除法浮点值问题

    当我尝试获取余数时 它给出了无效值 我试图获得两位小数的余数 我得到 3 4694469519536E 18 我的价值观是 x 0 1 y 0 005 我尝试了以下方法 echo ed fmod 0 1 0 005 OutPut 3 469
  • 处理查询字符串参数时 Codeigniter 缓存问题

    问候 我正在编写一个 CI Web 应用程序 它实现标准文件缓存功能 如下所示 this gt output gt cache n 我使用了段和查询字符串参数的组合 因此似乎遇到了问题 我在用例和输出类代码中看到的是 缓存仅基于段 像这样

随机推荐

  • 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