TFTP协议下载实验

2023-11-16

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PORT 69
#define IP "192.168.122.87"
#define FINENAME "1_armcli.c"
int main(int argc, const char *argv[])
{
	//创建报式套接字
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd < 0)
	{
		perror("socket");
		return -1;
	}
	printf("socket success...\n");

	//填充服务器地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);



	//读写请求
	char buf[516] = "";
	//操作码
	unsigned short *p1 = (unsigned short *)buf;
	*p1 = htons(1);
	//文件名
	char *p2 = buf+2;
	strcpy(p2,FINENAME);
	//0
	char *p3 = p2+strlen(p2);
	*p3 = 0;
	//模式
	char *p4 = p3+1;
	strcpy(p4,"octet");

	//发送读写请求
	if(sendto(cfd,buf,2+strlen(p2)+1+strlen(p4)+1,0,(struct sockaddr *)&sin,sizeof(sin)) < 0)
	{
		perror("sendto");
		return -1;
	}

	ssize_t res = 0;
	socklen_t addrlen = sizeof(sin);
	unsigned short num = 1; //块编号
	int fd = -1;  //定义本地下载文件描述符

	while(1)
	{
		//接收数据包
		bzero(buf,sizeof(buf));
		res = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,&addrlen);
		if(res < 0)
		{
			perror("recvfrom");
			return -1;
		}

		//判断块编号,避免数据包重复
		if(3 == ntohs(*(unsigned short *)buf))
		{
			if(htons(num) == *(unsigned short *)(buf+2))
			{
				num++;
				if(-1 == fd)
				{
					fd = open(FINENAME,O_WRONLY|O_CREAT|O_TRUNC,0664);
					if(fd < 0)
					{
						perror("open");
						break;
					}
				}
				if(write(fd,buf+4,res-4) < 0)
				{
					perror("write");
					return -1;
				}

				//回复ACK
				*(unsigned short *)buf = htons(4);
				if(sendto(cfd,buf,4,0,(struct sockaddr *)&sin,sizeof(sin)) < 0)
				{
					perror("sendto");
					return -1;
				}
				//数据包小于512,结束
				if(res - 4 < 512)
				{
					printf("download success\n");
					break;
				}
			}
		}
		else if(5 == ntohs(*(unsigned short *)buf))
		{
			printf("%s\n",buf+4);
			break;
		}
	}
	//关闭文件描述符
	close(fd);
    close(cfd);
	return 0;
}

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

TFTP协议下载实验 的相关文章

  • http协议访问网址的流程

    http协议 http协议可以说是由三个部分组成的 超文本 URL Http 超文本 网页中的信息 如文字 图片 视频 URL 统一资源定位符 由三个部分组成 协议 主机端口 文件名及路径 使用http协议的访问流程 例如我们想访问百度 则
  • Linux网络编程基础

    Linux网络编程基础 1 协议的概念 什么是协议 典型协议 网络程序设计模式 分层模型 TCP IP四层模型 实际开发中常用模型 通信过程 协议的概念 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲
  • window下apache安装和配置

    下载 32位 http httpd apache org 64位 http www apachelounge com download 安装 解压Apache2 4到F Apache2 4 修改文件F Apache2 4 conf http
  • unix网络编程源代码编译

    最近开始研究unix网络编程 正所谓 学习网络编程的最好方法就是下载这些程序 对其进行修改和改进 只有这样才能深入理解与有关概念和方法 1 首先下载源代码 不多说了 2 照着readme中的步骤往下做 第一步就出现问题了 输入命令 conf
  • libevent(7)libevent中的事件event

    一 事件状态 libevent有4种事件状态 分别是 initialized pending active persistent 这4种状态的转换关系如下 1 已初始化 initialized 对应图中的non pending状态 表示事件
  • libev学习系列之四:ev_loop事件循环

    libev学习系列之四 ev loop事件循环 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 31 初稿 目录 文章目录 libev学习系列之四 ev loop事件循环 版本说明 目录 一 前言 二 描述 三 例子 一 前言
  • Connect函数阻塞

    1 采用select 在学习嵌入式Linux网络编程中 很多同学都发现了一个问题 那就是调用connect函数时 如果服务端关闭 客户 端调用connect 函数时 发现阻塞在那里 而且利用ctrl c信号去停止客户端程序时 需要等待一个较
  • 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

    http blog csdn net xujiezhige article details 41115453
  • URL中的+,空格,/,?,%,#,&,= 及转义处理

    URL出现了有 空格 等特殊符号的时候 可能在服务器端无法获得正确的参数值 如何是好 解决办法 将这些字符转化成服务器可以识别的字符 对应关系如下 URL中的特殊字符 有些符号在URL中是不能直接传递的 如果要在URL中传递这些特殊符号 那
  • libevent(6)windows上使用iocp网络模型

    windows操作系统上不能使用epoll模型 只能使用iocp网络模型 这里我把怎么在windows上使用iocp的代码直接贴上 include
  • LibEvent中文帮助文档

    http blog csdn net zhouyongku article details 53431597 libevent源码分析 http blog csdn net yusiguyuan article details 182675
  • C# 网络编程之webBrowser乱码问题及解决知识

    在使用PHP MySQL编写网页时 曾近就因为显示中文乱码 口口口 困扰我很长时间 没想到在C 制作浏览器或获取XML页面时也经常会遇到显示中文乱码的问题 可想而知怎样解决编码问题或统一编码问题是非常严重的问题 下面就讲讲我的一些理解及解决
  • Ubuntu 下同局域网主机访问Tomcat 服务器

    转自 https blog csdn net zm yang article details 70483439 搭建Tomcat环境 自己写些小应用 需要用到服务器 便在Ubuntu环境下搭建了个Tomcat服务器 搭建方法很简单 去官网下
  • C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化 将object对象序列化常见的两种方式即string和xml对象 第一种将object转换为string对象 这种比较简单没有什么可谈的 public string
  • 基于TCP的服务器端/客户端

    TCP服务器端默认函数调用顺序 socket 创建socket bind 分配socket地址 listen 等待连接请求状态 accept 允许连接 read write 数据交换 close 断开连接 等待连接请求状态 int list
  • 自旋锁(spinlock) 解释得经典,透彻

    自旋锁与互斥锁有点类似 只是自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 自旋 一词就是因此而得名 由于自旋锁使用者一般保持锁时间非常短 因此选择自旋而不是睡眠是非常必
  • 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

    VS2013中调试Socket代码时 遇到了点小问题 问题代码为 cpp view plain copy inet ntoa addrClient sin addr 生成错误消息为 plain view plain copy error C
  • 并发编程概览

    由于内容较多 将会分成多篇文章详述 可移步查看 操作系统发展史 多道技术 进程理论 进程的并行与并发 进程的三状态 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞 创建进程的多种方式 join方法 进程间数据默认隔离 进程间通信IPC机制
  • c99编译报错改用gnu99

    使用c99编译出警告信息 implicit declaration of function usleep 按常规来讲 出现 implicit declaration of function xxxx 是因为头文件未包含导致的 但是uslee
  • websocket协议

    WebSocket是一种在Web应用程序中实现实时双向通信的协议 一种在单个TCP连接上进行全双工通信的协议 它使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 WebSocket 与 HTTP 2 一样 其实都

随机推荐

  • property_get函数使用

    在 域的使用方法 int property get const char key char value const char default value int property set const char key const char
  • 设置div中的背景颜色及div中的字体颜色

    div style background black color white 菜单3 div 这样就设置了这个div的背景颜色为黑色 即background属性的颜色 字体颜色为白色 即color属性的颜色 效果如下图
  • C语言学习开头以及个人目标

    一 自我介绍 本人是一个来自某末流211大学的本科生 因为高考的时候发挥失常了 原本可以去一些末985垫底专业或中211的热门专业 最后只能是双非一本随便挑 但是因为不甘心失败就冲了好学校的差专业 最终还是调剂了材料专业 后来好好学习想转专
  • vi/vim 设置tab为4个空格

    vim 编辑器中 tab 有时不是4个空格 代码看起来比较凌乱 配置文件位置 etc vim vimrc Kali linux set ts 4 set softtabstop 4 set shiftwidth 4 set expandta
  • 转帖:DirectShow 在VS2005中环境配置

    转载请标明是引用于 http blog csdn net chenyujing1234 baseclasses参考代码 VS2005下编译通过 http www rayfile com zh cn files 12ac1b0c 7335 1
  • 关于QQ的技巧

    让电脑只能上到自己的QQ 任何QQ都无法登陆 首先把自己的QQ设置为自动登陆模式 接下来最关键的就是移动或删除QQ主目录下的WizardCtrl dll文件 这样就算别的QQ怎么样也登陆不了的了 如果你想上两个QQ的话就把QQ整个目录复制多
  • 2022年 IEEE VIS 科学可视化与体渲染论文整理与分析

    因为最近工作的关系 需要研究一下IEEE VIS中2017年以后的与我之前主要方向 体渲染 医学可视化 有关的论文 我把这些年全部的论文进行了筛选和梳理 总共筛选出57篇论文 打算写一个文章来记录这些内容 这个栏目是2022年的6篇论文的介
  • spark集群搭建与mysql元数据管理

    找个spark集群搭建是针对于上一篇hadoop的基础上搭建的 所以spark的版本也是要按照着hadoop版本进行下载 1 解压spark 修改spark的 etc profile的home目录 2 安装SCALA 并配置SCALA HO
  • ElementUI的简单使用方法讲解

    这里我们以引入button按钮为例 其实很多表单 或者 时间 等等的组件 引入方式都是一样的 举一反三吧 首先 yarn add element ui S 让我们来安装这个包 main js 全局注册 element ui这个组件 完整引入
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • 2022年淘宝/天猫/京东618自动任务助手,带抢购功能源码

    下载地址 https wwc lanzouq com b01cfbrbi 支持自动完成淘宝 天猫 京东618任务 自动领取奖励 解放双手 棒棒的 先开启无障碍和悬浮窗权限 再运行助手 运行过程中可以按音量减 键强制停止 提前关闭媒体声音 直
  • 电梯安全监测丨S271W无线水浸传感器用于电梯机房/电梯基坑水浸监测

    城市化进程中 电梯与我们的生活息息相关 高层住宅 医院 商场 学校 车站等各种商业体建筑 公共建筑中电梯为我们生活工作提供了诸多便利 保障电梯系统的安全至关重要 特别是电梯机房和电梯基坑可通过智能化改造提高其安全性和稳定性 例如在暴风雨天气
  • 【转载】基于 NXP i.MX8QM 的 硬件隔离 介绍

    一 Hardware Partition 1 1 功能简介 Hardware Partition 中文叫硬件分区或者硬件隔离 基于 NXP i MX8QM 的 Hardware Partition 功能将 Resource Memory P
  • 2019顺网无盘服务器配置,顺网无盘如何不安装网维客户端上传系统到无盘服务器...

    14Q3的无盘万能镜像包中并没有安装网维大师客户端 为的是让大家可以自由选择安装网维大师客户端版本进行安装 而不会因为升级 降级这些麻烦又难理解的事情阻碍大家 近期也有人询问如何不安装网维客户端直接上传系统 其实非常简单 这里给大家做个详细
  • usb设备的检测及区分(sata硬盘、优盘及移动硬盘)

    原理 1 如果有外置usb设备插入 会产生 proc scsi usb storage目录 ide硬盘上默认 没有 并且会在 proc scsi usb storage目录中产生数字文件 此文件存储了设 备的相关信息 2 sys class
  • ES5和ES6声明的“全局变量”有什么不同?

    复看红宝石书关于执行上下文与作用域部分的时候发现了以前遗漏的小知识点 let和const的顶级声明不会定义在全局上下文中 1 什么是全局上下文 根据ECMAScript实现的宿主环境不同 表示全局上下文的对象可能不一样 但在浏览器中 我们所
  • ISE在线逻辑分析仪Chipscope的使用

    前言 和 Quartus 的 SingleTapII 类似 ISE 也有自己的内置在线逻辑分析仪 Chipscope 在这里记录一下 Chipscope 的主要使用方法 以便以后回顾 本文使用 UART 串口回环模块进行验证 我们要抓取的信
  • 【Linux】设计模式-----简单工厂模式

    概念 简单工厂模式即 只需要输入实例化对象的名称 工厂类就可以实例化出来需要的类 核心 实现工厂模式的核心就是多个派生类public继承基类 同时根据用户的需求在简单工厂类里面实例化基类的对象 从而根据基类里面的虚函数来实现对派生类的函数调
  • ajax核心代码提交,emlog评论ajax提交的两种方法

    推荐使用方法二 不需要修改源代码 通过正则过滤出系统的错误消息 方法一 需要修改源代码 1 include lib function base php中 function show 404 page 函数上方添加函数 显示json信息 pa
  • TFTP协议下载实验

    include