day36——homework

news2024/11/15 11:06:47

二、基于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.coloradmin.cn/o/2038969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据同步工具DataX

目录 1.概要 2.简介 3.DataX处理异构数据源 4.DataX的框架 5.DataX的核心架构 6.DataX的安装 7.DataX的使用案例 8.mysql同步到mysql案例 1.概要 本篇文件将介绍一款数据同步工具DataX的原理&#xff0c;安装&#xff0c;以及使用。 2.简介 官网连接&#xff1a;https…

STL经典案例(二)——公司招员工

需求&#xff1a;公司招了十个员工ABCDEFGHIJ&#xff0c;公司有五个部门&#xff0c;公司随机给这十个员工分配薪水&#xff0c;并且随机将这十名员工分配到不同的部门。 员工类中成员属性为姓名和工资&#xff0c;成员方法为设置姓名、设置工资、获得姓名、获得工资 部门有五…

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…

[C#]基于C# winform结合llamasharp部署llama3中文的gguf模型

【llmasharp源码】 https://github.com/SciSharp/LLamaSharp 【测试模型】 https://www.modelscope.cn/pooka74/LLaMA3-8B-Chat-Chinese-GGUF.git 【测试通过环境】 vs2019 netframework4.7.2 llamasharp0.15.0 cuda11.7.1cudnn8.8.0 注意测试发现使用cpu推理非常卡&a…

Stable Diffusion绘画 | ControlNet应用-SoftEdge(软边缘):让转绘更柔和

SoftEdge(软边缘) Canny(硬边缘) 有时候捕捉的细节过多&#xff0c;其实有时候并不需要那么多的细节。 例如下图中&#xff0c;围巾上的网格细节全部都被捕捉下来了&#xff1a; 切换到「SoftEdge(软边缘)」&#xff0c;它只重点抓取轮廓边缘&#xff0c;而且线条会比 Canny …

优购电商小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xf…

入门 PyQt6 看过来(项目)26 在线购物-主页面

功能导航页面很简单&#xff0c;就几个按钮功能。效果如下图&#xff1a; 1 主界面 ​ 包含 “商品选购”、”下单结算“、”销售分析“四个按钮以及“功能导航”标题。 2 工程目录 首先先创建工程目录及子目录&#xff1a; ​ 3 代码 主窗口文件为Main.py&#xff0c;其…

第2章 C语言基础知识

第2章 C语言基础知识 1.printf()函数 在控制台输出数据&#xff0c;需要使用输出函数&#xff0c;C语言常用的输出函数为printf()。 printf()函数为格式化输出函数&#xff0c;其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…

C++ 124类和对象_运算符重载_赋值

C 124类和对象_运算符重载_赋值 学习内容 解决自定义对象之间赋值是因析构函数重复释放内存时引发的异常问题 结果 代码 #include<iostream> using namespace std;//cout 在这里&#xff0c;没有它会报错//类和对象_运算符重载_赋值 //学习内容 //解决自定义对…

【Qt】Qt窗口 | 菜单栏QMenuBar

文章目录 一. 菜单栏二. 代码创建&使用菜单栏1. 创建菜单栏2. 在菜单栏中添加菜单3. 创建菜单项4. 在菜单项之间添加分割线5. 添加快捷方式6. 菜单/菜单项添加图标7. 添加子菜单 三. 图形化创建菜单栏 窗口 Qt 中窗口是通过QMainWindow类实现的 QMainWindow 是一个为用户提…

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…

代码随想录算法训练营第十五天(一)| 110.平衡二叉树 (优先掌握递归)257. 二叉树的所有路径

110.平衡二叉树 题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;fa…

vuex的原理和使用方法

简介 Vuex 是 Vue.js 应用的状态管理模式&#xff0c;它为应用内的所有组件提供集中式的状态&#xff08;数据&#xff09;管理。可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 Vuex的构成 state&#xff1a;state 是 Vuex 的数据中心&#xff0c;也就是说state是用来…

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

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

软件运维实施维保方案(Doc完整版原件)

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产…

NodeJS:查看、设置 nodejs 堆内存

一、查看nodejs 堆内存 vite.config.ts 从Node.js v10.0.0开始&#xff0c;v8模块被引入&#xff0c;允许你访问V8引擎的一些内部特性&#xff0c;包括堆内存统计信息。 import v8 from v8 // 可用内存总量 console.log(Total available heap size: ${v8.getHeapStatistics()…

2024年优秀的网站建设公司推荐

如今&#xff0c;高达 48% 的用户认为&#xff0c;判断企业信誉的首要因素是其网站设计。我整理了一份 2024 年全球顶级网站设计公司名单。 企业为什么要投资网站设计和开发&#xff1f; 数字平台或社交媒体在当前情况下取得了飞跃&#xff0c;帮助企业上以数字方式推广他们的…

【数据结构】顺序表——赋源码(结尾)

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 正文 1. 线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构&#x…

停止项目大小调整,开始搜索层自动缩放!

作者&#xff1a;来自 Elastic Matteo Piergiovanni&#xff0c;John Verwolf 我们新的 serverless 产品的一个关键方面是允许用户部署和使用 Elastic&#xff0c;而无需管理底层项目节点。为了实现这一点&#xff0c;我们开发了搜索层自动扩展&#xff0c;这是一种根据我们将在…