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;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL源码安装与MySQL基础学习

1、安装MySQL ​ 本次安装使用的是绿色硬盘版本&#xff0c;无需额外安装依赖环境&#xff0c;比较简单 修改相关配置文件&#xff1a; 设置环境变量&#xff0c;声明/宣告MySQL命令便于系统识别&#xff1a; 初始化数据库&#xff1a; 设置系统识别&#xff0c;进行操作&…

Java基础之隐式类型转换

类型转换 基本数据类型表示范围大小排序&#xff1a; 在变量赋值及算术运算的过程中&#xff0c;经常会用到数据类型转换&#xff0c;其分为两类&#xff1a; 隐式类型转换 显式类型转换 1 隐式类型转换 情形1&#xff1a;赋值过程中&#xff0c;小数据类型值或变量可以直…

八股文学习总结

八股文学习总结 文章目录 八股文学习总结一、总体概况二、Java基础三、集合四、JUC五、JVM六、MYSQL七、Redis八、MQ九、计网十、OS十一、附上我记的笔记 一、总体概况 八股文也看了好多天了&#xff0c;我对八股文基本上考察哪些点也都有了印象&#xff0c;主要的分为Java基础…

Spring-AOP实现后置、返回、异常和环绕通知

后置通知 在切入点的目标方法执行后&#xff08;无论有异常抛出没的&#xff09;&#xff0c;都会执行这个通知方法! 如果想要在通知方法里访问到目标方法返回的结果&#xff0c;可以用返回通知 返回通知 是在目标方法执行之后没有异常&#xff0c;并且返回结果后才执行通知…

【自用】Python爬虫学习(七):selenium网页自动化操作

Python爬虫学习&#xff08;七&#xff09; selenium介绍selenium基础用法selenium其他自动化操作selenium动作链与iframe的处理selenium无可视化界面与反检测实现 selenium介绍 selenium是一个广泛使用的开源自动化测试框架&#xff0c;主要用于Web应用程序的功能测试。它支持…

机器学习速成第二集——监督学习之分类(理论部分)!

目录 分类算法的种类 分类问题的应用场景 模型选择与评估 结论 如何在不同数据集中选择最适合的监督学习分类算法&#xff1f; 监督学习中集成模型与单一模型相比有哪些具体的优势和劣势&#xff1f; 优势&#xff1a; 劣势&#xff1a; 在处理高维稀疏数据时&#xf…

Kubernetes-K8S

Kubernetes由于单词太长&#xff0c;省略掉中间8个字母简称为K8S。它介于应用服务和服务器之间。能够通过策略协调和管理多个服务&#xff0c;只需要一个YAML文件配置。定义应用的部署顺序等信息&#xff0c;自动部署应用到各个服务器&#xff0c;还可以自动扩容缩容。 架构原理…

K8S资源之Service

概念 将一组 Pods 公开为网络服务的抽象方法。 ClientIP 模型 集群内访问类型。 命令行 # 暴露端口 kubectl expose deployment my-dep-nginx --port8000 --target-port80Yml文件 apiVersion: v1 kind: Service metadata:labels:app: my-dep-nginxname: my-dep-nginx spe…

【张】#12 enum 枚举

enum 枚举定义格式&#xff1a; enum <类型名> {<枚举常量表> }; 枚举其实就是一个整数 enum example {Aa,Bb10,Cc //给Bb赋值为10后&#xff0c;Cc的值会变成11 }; 枚举变量只能使用枚举值&#xff0c;枚举可以赋值给整型&#xff0c;整型不能赋值给枚举 #inc…

Django | 从中间件的角度理解跨站请求伪造(Cross-Site Request Forgey)[CSRF攻击]

文章目录 切入点案例测试views.py测试代码templates模板下的html文件配置路由运行服务 出现CSRF报错解决CRSF报错再次运行服务 查看结果 切入点 某些恶意网站上包含链接、表单按钮或者]avaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作 Gj…

HTML+CSS进阶用法(上)——平面转换、渐变、空间转换

欢迎来到CSS变换的世界&#xff0c;这里充满了创意和可能性。在本篇博客中&#xff0c;我们将一起学习如何使用transform属性来实现各种平面和空间转换效果&#xff0c;包括位移、旋转、缩放&#xff0c;以及如何通过渐变和动画来增强我们的网页设计。无论你是初学者还是有经验…

并发编程(第二天)

interrupt 方法详解 打断 sleep&#xff0c;wait&#xff0c;join 的线程 这几个方法都会让线程进入阻塞状态 打断 sleep 的线程, 会清空打断状态打断正常运行的线程 打断正常运行的线程, 不会清空打断状态打断 park 线程 打断 park 线程, 不会清空打断状态 如果打断标记已经…

【Python】线性规划模型(笔记)

线性规划的作用 求一个线性目标函数在线性可行域内的最值问题 线性规划的典型应用 配送运输问题&#xff1a;选大车还是小车生产规划问题&#xff1a;每种原料各买多少几何切割问题&#xff1a;切割长宽各多少买卖利润问题&#xff1a;最多能挣多少钱… 线性规划的本质 问…

C语言FTP文件传输(完成基本文件传输的功能)

文章目录 前言一、实现思路二、实现FTP服务器三、实现FTP客户端四、实现体验总结 前言 本篇文章带大家来完成一下C语言FTP文件传输助手最基础的功能&#xff0c;也就是客户端和服务器之间进行最基础的文件传输的功能。 一、实现思路 实现一个基本的 FTP 客户端和服务器&…

【生成式人工智能-十一一个不修改模型就能加速语言模型生成的方法】

一个加速语言模型生成的方法 现在语言模型的一个弊端speculative decoding预言家预测的问题 speculative decoding 模块的实现方法NAT Non-autoregressive模型压缩使用搜索引擎 一些更复杂些的speculative decoding 实现方式 speculative decoding 是一个适用于目前生成模型的加…

WSL 忘记ubuntu的密码

文章目录 1. 以管理员身份打开 PowerShel2.输入命令 wsl.exe -d Ubuntu-20.04 --user root3.输入命令 passwd username 修改用户密码&#xff0c;username即待重置的用户的名称 1. 以管理员身份打开 PowerShel 2.输入命令 wsl.exe -d Ubuntu-20.04 --user root 注意版本号是自…

Springboot整合Flowable入门-学习笔记

目录 1、定义流程&#xff08;画图&#xff09; 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务&#xff08;代办任务&#xff09; 7、…

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…

傻瓜式一步到位Mysql 8.0 密码修改

5.7之前修改密码语句 update user set authentication_string password(“root”) where user “root”; mysql 5.7.9以后废弃了password字段和password()函数&#xff1b;并在user表加了authentication_string:字段表示用户密码 #进入到mysql 安装目录下 #停止 mysql 服务 …

怎么调试python脚本

打开pycharm community 2019.1软件&#xff0c;创建一个项目。 创建一个py后缀的文件作为示范&#xff0c;文件名自己定义。 编写代码&#xff0c;然后右键点击进行运行&#xff0c;查看一下是否有问题。 点击右上角的虫子图标&#xff0c;然后下面会有控制面板出来&#xff0c…