当前位置: 首页 > news >正文

day36——homework

二、基于UDP的TFTP文件传输

1)tftp协议概述

简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输

特点:

是应用层协议

基于UDP协议实现

数据传输模式

octet:二进制模式(常用)

mail:已经不再支持

2)tftp下载模型

TFTP通信过程总结

  1. 服务器在69号端口等待客户端的请求
  2. 服务器若批准此请求,则使用 临时端口 与客户端进行通信。
  3. 每个数据包的编号都有变化(从1开始)
  4. 每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包
  5. 数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。

3)tftp协议分析

差错码:

0 未定义,差错错误信息

1 File not found.

2 Access violation.

3 Disk full or allocation exceeded.

4 illegal TFTP operation.

5 Unknown transfer ID.

6 File already exists.

7 No such user.

8 Unsupported option(s) requested.

#include <myhead.h>
#define SER_PORT 69            //服务器端口号
#define SER_IP "192.168.0.115" //服务器ip地址
#define CLI_PORT 5555          //客户端端口号
#define CLI_IP "192.168.0.100" //客户端ip地址
#define BUF_SIZE 516           //缓冲区大小
#define TIMEOUT 3              //超时时间(秒)
void display()
{printf("请选择功能:\n");printf("1. 文件下载\n");printf("2. 文件上传\n");printf("3. 退出程序\n");
}
int main(int argc, const char *argv[])
{while (1){int k = 0;display();int choice;scanf("%d", &choice);char filename[100];if (choice == 1 || choice == 2){printf("请输入文件名: ");scanf("%s", filename);}int file = open(filename, O_RDWR | O_CREAT, 0664);if (file == -1){printf("无法打开文件 %s\n", filename);return 1;}switch (choice){case 1:{//1、创建用于通信的服务器套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); //3//2、向服务器发送下载请求char buf[BUF_SIZE];short *p1 = (short *)buf;*p1 = htons(1); //操作码char *p2 = buf + 2;strcpy(p2, filename); //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet");                        //模式位int size = 2 + strlen(p2) + strlen(p4) + 2; //请求包的总长度//将请求包发送给服务器struct sockaddr_in sin;socklen_t sinlen = sizeof(sin);sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);sendto(cfd, buf, size, 0, (struct sockaddr *)&sin, sinlen);while (1){ssize_t str_len = recvfrom(cfd, buf, BUF_SIZE, 0, (struct sockaddr *)&sin, &sinlen);if (ntohs(*p1) == 3){write(file, buf + 4, str_len - 4);*p1 = htons(4);sendto(cfd, buf, size, 0, (struct sockaddr *)&sin, sinlen);if (str_len < BUF_SIZE - 4){break;}}}//发送分手请求*p1 = htons(5);sendto(cfd, buf, size, 0, (struct sockaddr *)&sin, sinlen);close(cfd);bzero(buf, BUF_SIZE);break;}case 2:{// 1、创建用于通信的服务器套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); //3// 2、向服务器发送上传请求char buf[BUF_SIZE];short *p1 = (short *)buf;*p1 = htons(2); //操作码,表示上传char *p2 = buf + 2;strcpy(p2, filename); //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet");                        //模式位int size = 2 + strlen(p2) + strlen(p4) + 2; //请求包的总长度// 将请求包发送给服务器struct sockaddr_in sin;socklen_t sinlen = sizeof(sin);sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);sendto(cfd, buf, size, 0, (struct sockaddr *)&sin, sinlen);short *ack = (short *)(buf + 2);int n = 1;while (1){ssize_t str_len = recvfrom(cfd, buf, BUF_SIZE, 0, (struct sockaddr *)&sin, &sinlen);if (ntohs(*p1) == 4){int res = read(file, buf + 4, BUF_SIZE - 4);*p1 = htons(3);*ack = htons(n);n++;sendto(cfd, buf, BUF_SIZE, 0, (struct sockaddr *)&sin, sinlen);if (res < BUF_SIZE - 4){break;}}}//发送分手请求*p1 = htons(5);sendto(cfd, buf, size, 0, (struct sockaddr *)&sin, sinlen);close(cfd);bzero(buf, BUF_SIZE);break;}case 3:{k = 1;break;}}printf("k=%d\n", k);if (k == 1){break;}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • cocosUI多分辨率适配
  • 初心 | AIGC时代下的思想蜕变
  • Java 阿里云视频直播开发流程
  • C语言中10个字符串函数详解
  • 你对开源项目有什么期待?
  • 阿里云-java调用短信服务,第三方接口的开启(傻瓜式教程)
  • SSLVPN对比IPSECVPN安全设备的起源、发展、以及目前行业使用场景
  • KEEPALIVED是什么?以及实现各功能的配置实验
  • 一键换肤(Echarts 自定义主题)
  • 89. UE5 RPG 实现伤害 冷却 消耗技能描述
  • 堆(数据结构)
  • 【C语言篇】C语言常考及易错题整理DAY3
  • 探索粉色扶郎花的浪漫世界:花语与新品花束推荐
  • PyTorch 传统模型训练业务全流程
  • IOS 04 TangramKit 纯代码开发
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 78. Subsets
  • co.js - 让异步代码同步化
  • Git 使用集
  • Hibernate最全面试题
  • JAVA 学习IO流
  • Linux链接文件
  • Python连接Oracle
  • React-生命周期杂记
  • Spring Cloud中负载均衡器概览
  • 阿里云Kubernetes容器服务上体验Knative
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 时间复杂度与空间复杂度分析
  • 事件委托的小应用
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 用 Swift 编写面向协议的视图
  • Mac 上flink的安装与启动
  • 带你开发类似Pokemon Go的AR游戏
  • 正则表达式-基础知识Review
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​比特币大跌的 2 个原因
  • #宝哥教你#查看jquery绑定的事件函数
  • #微信小程序(布局、渲染层基础知识)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (23)Linux的软硬连接
  • (7)svelte 教程: Props(属性)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (七)Java对象在Hibernate持久化层的状态
  • (五)MySQL的备份及恢复
  • (一) 初入MySQL 【认识和部署】
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)大型网站的系统架构
  • ****三次握手和四次挥手
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 8 跨平台高性能边缘采集网关
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET简谈设计模式之(单件模式)