2024.03.01作业

news2024/11/18 10:21:24

1. 基于UDP的TFTP文件传输

#include "test.h"

#define SER_IP "192.168.1.104"
#define SER_PORT 69
#define IP "192.168.191.128"
#define PORT 9999

enum mode
{
    TFTP_READ = 1,
    TFTP_WRITE = 2,
    TFTP_DATA = 3,
    TFTP_ACK = 4,
    TFTP_ERR = 5
};

void get_filename(char* filename, int size)
{
    bzero(filename, size);

    printf("请输入文件名:");
    fgets(filename, size, stdin);
    filename[strlen(filename) - 1] = 0;
}

void rw_request(char* pack, int pack_size, char* filename, int mode, int* packlen)
{
    bzero(pack, pack_size); 

    short* p1 = (short*)pack;
    *p1 = htons(mode);

    char* p2 = (char*)(p1 + 1);
    strcpy(p2, filename);

    char* p4 = p2 + strlen(p2) + 1;
    strcpy(p4, "octet");

    *packlen = 4 + strlen(p2) + strlen(p4);
}

void pack_data(char* pack, int num, char* rbuf, int len, int* packlen)
{
    bzero(pack, sizeof(pack)); 

    short* p1 = (short*)pack;
    *p1 = htons(TFTP_DATA);

    short* p2 = p1 + 1;
    *p2 = htons(num);

    char* p4 = (char*)(p2 + 1);
    for (int i = 0; i < len; i++)
    {
        *(p4 + i) = rbuf[i];
    }

    *packlen = 4 + len;
}

void pack_ack(char* ack, int num)
{
    bzero(ack, 4);

    short* a = (short*)ack;
    *a = htons(TFTP_ACK);
    *(a + 1) = htons(num);
}

void pack_errmsg(char* pack, char* msg, int* packlen)
{
    bzero(pack, sizeof(pack));

    short* p = (short*)pack;
    *p = htons(TFTP_ERR);
    *(p + 1) = htons(0);

    char* errmsg = (char*)(p + 2);
    strcpy(errmsg, msg);

    *packlen = 4 + strlen(errmsg);
}

void client_recv(int sfd, struct sockaddr_in* sin, socklen_t* socklen)
{
    char filename[128];
    get_filename(filename, sizeof(filename));

    char pack[516] = "";
    int packlen = 0;
    rw_request(pack, sizeof(pack), filename, TFTP_READ, &packlen);
    
    sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);

    int fd = -1;
    if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664)) == -1)
    {
        perror("create file error");
        return;
    }

    char wbuf[512] = "";
    int block_num = 0;
    while (1)
    {
        bzero(pack, sizeof(pack));
        packlen = recvfrom(sfd, pack, sizeof(pack), 0, (struct sockaddr*)sin, socklen);
        short* p = (short*)pack;
        short code = ntohs(*p);
        short num = ntohs(*(p + 1));

        if (3 == code && num == ++block_num)
        {
            write(fd, pack + 4, packlen - 4);

            char ack[4];
            pack_ack(ack, block_num);
            sendto(sfd, ack, 4, 0, (struct sockaddr*)sin, *socklen);
            
            if (packlen < 512)
            {
                printf("下载完成\n");
                close(fd);
                break;
            }
        }
    }
}

void client_send(int sfd, struct sockaddr_in* sin, socklen_t* socklen)
{
    char filename[128];
    get_filename(filename, sizeof(filename));

    char pack[516] = "";
    int packlen = 0;
    rw_request(pack, sizeof(pack), filename, TFTP_WRITE, &packlen);

    sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);

    int fd = -1;
    if ((fd = open(filename, O_RDONLY)) == -1)
    {
        perror("open error");
        return;
    }

    char ack[4];
    char rbuf[512] = "";
    int len;
    while (1)
    {
        recvfrom(sfd, ack, 4, 0, (struct sockaddr*)sin, socklen);
        short* a = (short*)ack;
        short code = ntohs(*a);
        short num = ntohs(*(a + 1));

        if (4 == code && (len = read(fd, rbuf, sizeof(rbuf))) > 0)
        {
            pack_data(pack, num + 1, rbuf, len, &packlen);

            sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);

            bzero(rbuf, sizeof(rbuf));

        }
        else
        {
            printf("上传成功\n");
            break;
        }
    }
}

int main(int argc, char const *argv[])
{
    int sfd = -1;
    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sfd)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);

    int reuse = 1;
    if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    socklen_t socklen = sizeof(sin);

    printf("1.上传\n");
    printf("2.下载\n");
    printf("0.退出\n");
    printf("请输入:");
    int n;
    scanf("%d", &n);
    getchar();

    if (1 == n)
    {
        client_send(sfd, &sin, &socklen);
    }
    else if (2 == n)
    {
        client_recv(sfd, &sin, &socklen);
    }
    else
    {
        printf("输入错误\n");
    }
    
    close(sfd);

    return 0;
}

2. TCP机械臂测试

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

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

相关文章

javaWebssh在线授课辅导系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

ESP-01S烧录AT指令

一、准备工具 硬件工具 1、ESP32-01S 2、USB转TTL线&#xff08;也可以用USB转TTL模块&#xff0c;我这里是没有&#xff0c;所以没有用&#xff09; 红线5V黑线GND白线RXD绿线TXD 3、单片机&#xff08;用途后面说&#xff09; 软件工具 4、首先打开->安信可官网下载E…

开源模型Mistral 7B+Amazon SageMaker部署指南

一、Mistral 7B简述 Mistral AI 是一家总部位于法国的 AI 公司&#xff0c;其使命是将公开可用的模型提升至最先进的性能水平。他们专注于构建快速而安全的大型语言模型&#xff08;LLM&#xff09;&#xff0c;此类模型可用于从聊天机器人到代码生成等各种任务。不久前其发布…

洛谷p1225 c++(使用高精度)

题解: 一开始我这个代码想到的是使用递归来求解 int digui(int n){int sum=0;if(n==1)sum=1;if(n==2)sum=2;if(n==1||n==2)return sum;if(n>2){return sum+=digui(n-1)+digui(n-2);} } 但是后面发现明显超时,我试图用记忆化搜索来抢救一下,所以就有了下面代码 int di…

Benchmark学习笔记

小记一篇Benchmark的学习笔记 1.什么是benchmark 在维基百科中&#xff0c;是这样子讲的 “As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, te…

实战:Oracle Weblogic 11g 安装部署(10.3.6.0)

导读 本文介绍在redhat linux 6.6上安装Oracle weblogic 11g&#xff08;10.3.6.0&#xff09;版本 环境&#xff1a;redhat6.6 jdk 1.7 1、下载webLogic10.3.6 http://www.oracle.com/technetwork/cn/middleware/weblogic/downloads/wls-main-091116-zhs.html2 、在linux的ro…

win11系统中nginx简单的代理配置

一.背景 为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11家庭版 nginx版本&#xff1a;1.24.0 二.配置代理 之前文章已经说明了nginx简单的安装&#xff0c;要看阅读这个文章哈。web服务器nginx下载及在win11的安装-CSDN博客 1.配置需求识别 前端服务nginx(80…

Java进阶-IO(3)

话接上回&#xff0c;继续java IO的学习。上一次说完了字符流的读写数据&#xff0c;这次将基础部分剩余的一点内容看完。 一、流按功能分类 1、系统流 1.1 概述 系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。 System.in&#xff1a;标…

Vue3快速上手(十六)Vue3路由传参大全

Vue3路由传参 一、传参的多种方式 1.1 拼接方式 这种方式适合传递单个参数的情况&#xff0c;比如点击查看详情&#xff0c;传个id这样的场景 传参&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

类与对象(一)

目录 1 什么是面向过程和面向对象 1.1举例 2类的引入 3类的定义 3.1类的两种定义方式&#xff1a; 4.类的访问限定符及封装 4.1访问限定符 4.1.1为什么要有访问限定符 4.1.2有哪些访问限定符呢&#xff1f; 4.1.3简单举例理解 4.1.4C中的class与struct的区别(面试问题…

使用pyannote-audio实现声纹分割聚类

使用pyannote-audio实现声纹分割聚类 # GitHub地址 https://github.com/MasonYyp/audio1 简单介绍 pyannote.audio是用Python编写的用于声纹分割聚类的开源工具包。在PyTorch机器学习基础上&#xff0c;不仅可以借助性能优越的预训练模型和管道实现声纹分割聚类&#xff0c;还…

图解Vivado工程的目录结构

一、目录结构 ​在使用Vivado进行工程设计时&#xff0c;创建工程以及运行工程的过程中都会生成大量的目录和文件&#xff0c;下面图将对目录和文件结构及功能进行一个简单说明。 工程示例图 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 二、参考资料…

windows下安装cnpm

cnpm是淘宝团队开发的一个针对中国用户的npm镜像源&#xff0c;它是npm的一个定制版本。由于国外的npm源在国内访问速度较慢&#xff0c;所以cnpm镜像源可以提供更快的下载速度。cnpm的使用方式与npm基本相同&#xff0c;只需将npm替换为cnpm即可。 要想使用cnpm等先安装node.…

面试准备:排序算法大汇总 C++

排序算法总结 直接插入排序 取出未排序部分的第一个元素&#xff0c;与已排序的部分从后往前比较&#xff0c;找到合适的位置。将大于它的已排序的元素向后移动&#xff0c;将该元素插入到合适的位置。 //1. 直接插入排序 void InsertionSort(vector<int>& nums){f…

如何确保JDK版本与操作系统架构匹配?

1. 序言 最近的工作中&#xff0c;需要升级JDK版本到17.0.7&#xff0c;以解决一个JDK bug&#xff1a;JDK-8299626该bug的core dump关键字如下&#xff1a;SIGSEGV in PhaseIdealLoop::build_loop_late_post_work公司JDK团队提供的、包含JDK的基础镜像&#xff0c;有aarch64和…

深入了解Java虚拟机(JVM)

Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心组件&#xff0c;它负责解释执行Java字节码&#xff0c;并在各种平台上执行。JVM的设计使得Java具有跨平台性&#xff0c;开发人员只需编写一次代码&#xff0c;就可以在任何支持Java的系统上运行。我们刚开始学习Ja…

Launch学习

参考博客&#xff1a; (1) 史上最全的launch的解析来啦&#xff0c;木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包&#xff0c;假设需要使用机器人导航模块&#xff0c;但是这个模块中包含着地图、定位、路径规划等不同的功能包&#xff0c;它们的逻…

【Python】1. 背景知识

认识 Python 计算机基础概念 什么是计算机? 很多老一辈的人, 管下面这个叫做计算机. 然鹅, 它只是 “计算器”, 和计算机是有很大区别的. 现在我们所说的计算机, 不光能进行算术运算, 还能进行逻辑判断, 数据存储, 网络通信等等功能,。 以至于可以自动的完成非常复杂的工作…

SLAM基础知识-卡尔曼滤波

前言&#xff1a; 在SLAM系统中&#xff0c;后端优化部分有两大流派。一派是基于马尔科夫性假设的滤波器方法&#xff0c;认为当前时刻的状态只与上一时刻的状态有关。另一派是非线性优化方法&#xff0c;认为当前时刻状态应该结合之前所有时刻的状态一起考虑。 卡尔曼滤波是…

java垃圾回收

垃圾回收 一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能…