2024.03.01作业

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 9999enum 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.hqwc.cn/news/505958.html

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

相关文章

Java 石头剪刀布小游戏

一、任务 编写一个剪刀石头布游戏的程序。程序启动后会随机生成1~3的随机数&#xff0c;分别代表剪刀、石头和布&#xff0c;玩家通过键盘输入剪刀、石头和布与电脑进行5轮的游戏&#xff0c;赢的次数多的一方为赢家。若五局皆为平局&#xff0c;则最终结果判为平局。 二、实…

项目运维方案

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 软件开发全套资料获取&#xff1a;软件开发全套资料_数字中台建设指南-CSDN博客

Redis安全加固策略:配置文件权限设置 配置本地日志存储目录 连接超时时间限制

Redis安全加固策略&#xff1a;配置文件权限设置 & 配置本地日志存储目录 & 连接超时时间限制 1.1 配置文件权限设置1.2 配置本地日志存储目录1.3 连接超时时间限制 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1.1 配置文件权限…

(六)Dropout抑制过拟合与超参数的选择--九五小庞

过拟合 即模型在训练集上表现的很好&#xff0c;但是在测试集上效果却很差。也就是说&#xff0c;在已知的数据集合中非常好&#xff0c;再添加一些新数据进来效果就会差很多 欠拟合 即模型在训练集上表现的效果差&#xff0c;没有充分利用数据&#xff0c;预测准确率很低&a…

Docker使用数据卷自定义镜像Dockerfile

文章目录 一、数据卷二、Dockerfile自定义centos 一、数据卷 数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直接映射进容器&#xff0c;它可以提供很多有用的特性&#xff1a; 1.数据卷 可以在容器之间共享和重用 2.对数据卷的…

独立游戏《星尘异变》UE5 C++程序开发日志1——项目与代码管理

写在前面&#xff1a;本日志系列将会向大家介绍在《星尘异变》这款模拟经营游戏&#xff0c;在开发时用到的与C相关的泛用代码与算法&#xff0c;主要记录UE5C与原生C的用法区别&#xff0c;以及遇到的问题和解决办法&#xff0c;因为这是我本人从ACM退役以后第一个从头开始的项…

esp32 C3和S3 开发板电流对比

出去好奇用合宙家的 lot power 测了两块开发板的运行电流。 esp32 S3 (嘉立创开发板 8N8 版本) 模式 电流downloa模式49 毫安空代码91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 无串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

欧拉-拉格朗日动力学 Matlab实现

文章目录 欧拉-拉格朗日方程欧拉-拉格朗日方程 使用拉格朗日欧拉动力学公式 (J. J. Uicker, “On the dynamic analysis of spatial linkages using 4 x 4 matrices,” Ph.D. dissertation, Northwestern Univ., Aug. 1965)对任意自由度的机械臂进行逆动力学分析。输入为关节空…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…

PHP设计模式初探 以前写的完整PPT!!!!!

幻灯片 1: 初探PHP设计模式 copyright CSDN 白毛大侠 幻灯片 2: 我们说别人代码写的烂&#xff0c;烂在哪&#xff1f; 反思我们平时是怎么写代码的&#xff1f; 非开发者如何转开发&#xff08;业务&#xff09; &#xff1f; 一.过程与对象 幻灯片 3: <?…

MySQL中json类型的字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…