2024-3-1-网络编程作业
1>操控机械臂:
通过w(红色臂角度增大)s(红色臂角度减小)
d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂
源代码:
#include <myhead.h>
#define minStep 10 //最小偏移角度#define SER_IP "10.168.1.116" //服务器ip
#define SER_PORT 8888 //服务器端口号#define CLI_IP "10.168.1.111 " //客户端IP
#define CLI_PORT 9999 //客户端端口号char scanKeyboard(); //从键盘获取控制符
void r_angleUp(int fd, char buf[], int buf_size, char skb); //红色臂向右偏移
void r_angleDown(int fd, char buf[], int buf_size, char skb); //红色臂向左偏移
void b_angleUp(int fd, char buf[], int buf_size, char skb); //蓝色色臂向右偏移
void b_angleDown(int fd, char buf[], int buf_size, char skb); //蓝色臂向左偏移int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); //3//2、绑定(非必须)//2.1 填充地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(CLI_PORT);cin.sin_addr.s_addr = inet_addr(CLI_IP);//2.2 绑定if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、连接服务器//3.1填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //地址族sin.sin_port = htons(SER_PORT); //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址//3.2 连接服务器if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("connect success\n");//4、数据收发char rbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};unsigned char bbuf[5] = {0xff, 0x02, 0x01, 0x00, 0xff};//发送给服务器当做初始值send(cfd, rbuf, sizeof(rbuf), 0);sleep(1);send(cfd, bbuf, sizeof(bbuf), 0);printf("请键入W、S、A、D进行控制:");while (1){char skb = scanKeyboard();if (skb == 27)printf("\n请键入W、S、A、D进行控制(键入Q退出控制!):\n");switch (skb){case 'W':case 'w':{int buf_size1 = sizeof(rbuf);r_angleUp(cfd, rbuf, buf_size1, skb);}break;case 'S':case 's':{int buf_size1 = sizeof(rbuf);r_angleDown(cfd, rbuf, buf_size1, skb);}break;case 'D':case 'd':{int buf_size2 = sizeof(bbuf);b_angleUp(cfd, bbuf, buf_size2, skb);}break;case 'A':case 'a':{int buf_size2 = sizeof(rbuf);b_angleDown(cfd, bbuf, buf_size2, skb);}break;case 'Q':{printf("\n控制已结束\n");return -1;}break;}}//5、关闭套接字close(cfd);return 0;
}char scanKeyboard()
{//终端有三种工作模式:规范模式、非规范模式、原始模式//非规范模式:所有输入时即时有效的,不需要用户另外输入行结束符char in;//定义两个termios结构体变量struct termios new_settings; //保存用于操作的终端属性struct termios stored_settings; //保存当前的终端属性,以便之后恢复//把标准输入的状态存储在终端配置参数stored_settings中tcgetattr(0, &stored_settings);//把当前终端属性的副本赋值给new_settings,准备对其进行修改。new_settings = stored_settings;//修改new_settings的c_lflag字段,关闭规范模式(ICANON)。//在非规范模式下,输入是即时的,不需要按回车键。new_settings.c_lflag &= (~ICANON);//设置new_settings的VTIME为0。//非规范模式下读取输入时不使用超时。new_settings.c_cc[VTIME] = 0; //非规范模式读取时的超时时间--VTIME//tcgetattr(0, &stored_settings);//在非规范模式下读取输入时至少需要读取1个字符才能返回new_settings.c_cc[VMIN] = 1; //非规范模式读取时的最小字符数--VMIN//将标准输入的属性设置为new_settings,TCSANOW参数指示更改应立即生效,不等待数据传输完成。tcsetattr(0, TCSANOW, &new_settings); //不等数据传输完毕就立即改变属性--TCSANOWin = getchar();//读取完字符后,恢复标准输入的原始属性tcsetattr(0, TCSANOW, &stored_settings);return in;
}void r_angleUp(int fd, char buf[], int buf_size, char skb)
{if (skb != 27) //skb==ECS时退出控制{buf[3] += minStep; //每次操作的角度偏移minStep度if (buf[3] >= 90){buf[3] = 90;}send(fd, buf, buf_size, 0);}return;
}
void r_angleDown(int fd, char buf[], int buf_size, char skb)
{if (skb != 27){buf[3] -= minStep;if (buf[3] <= -90){buf[3] = -90;}send(fd, buf, buf_size, 0);}return;
}
void b_angleUp(int fd, char buf[], int buf_size, char skb)
{if (skb != 27){buf[3] += minStep;if (buf[3] >= 180){buf[3] = 180;}send(fd, buf, buf_size, 0);}return;
}
void b_angleDown(int fd, char buf[], int buf_size, char skb)
{if (skb != 27){buf[3] -= minStep;if (buf[3] <= 0){buf[3] = 0;}send(fd, buf, buf_size, 0);}return;
}
效果展示:
机械臂演示
2>基于UDP的TFTP文件传输
源代码:
#include <myhead.h>
#define SER_IP "10.168.1.116"
#define SER_PORT 69
#define MAXSIZE 1024
#define FILESIZE 128
enum mode_opt
{READ = 1,WRITE = 2,DATA = 3,ACK = 4,ERR = 5
};void request_WR(char pack[], int pack_size, char *name, int mode, int *packlen)
{bzero(pack, pack_size);char *p = pack;short int *p1 = (short int *)p;*p1 = htons(mode); //设置操作码char *p2 = (char *)(p1 + 1); //**********strcpy(p2, name); //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet"); //模式位*packlen = 4 + strlen(p2) + strlen(p4); //请求包的大小
}int download(int cfd, struct sockaddr_in sin, char *name)
{char pack[MAXSIZE] = "";int packlen = 0;//组件协议包:下载请求request_WR(pack, sizeof(pack), name, READ, &packlen);sendto(cfd, pack, packlen, 0, (struct sockaddr *)&sin, sizeof(sin));int rcvlen = 0;int fd = -1;if ((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1){perror("open error");close(fd);return -1;}//添加了对块编号的检查和管理unsigned short expected_block_num = 1;char data[MAXSIZE] = "";socklen_t socklen = sizeof(sin);while (1){//收取服务器发来的数据包rcvlen = recvfrom(cfd, data, sizeof(data), 0, (struct sockaddr *)&sin, &socklen);if (rcvlen == -1){perror("recv error");return -1;}short int *p1_data = (short int *)data;short code = ntohs(*p1_data);short block_num = ntohs(*(p1_data + 1));if (code == DATA){if (block_num == expected_block_num) //只有当接收到的数据包的块编号符合预期时,才会写入文件并发送ACK{write(fd, data + 4, rcvlen - 4);char ack[4];*(short *)ack = htons(ACK);*(short *)(ack + 2) = htons(block_num); // 确认收到的块编号sendto(cfd, ack, 4, 0, (struct sockaddr *)&sin, sizeof(sin));if (rcvlen < 516) // 如果接收到的数据包小于516字节,表示是最后一个数据包{printf("下载完成\n");break;}expected_block_num++;}}else if (code == ERR){printf("ERROR:%d\n", block_num); // block_num在这里作为错误码close(fd);return -1; // 返回错误码}}close(fd);return 0;
}
int upload(int cfd, struct sockaddr_in sin, char *name)
{char packet[MAXSIZE] = "";int packlen = 0;request_WR(packet, sizeof(packet), name, WRITE, &packlen);sendto(cfd, packet, packlen, 0, (struct sockaddr *)&sin, sizeof(sin));int fd = -1;if ((fd = open(name, O_RDONLY)) == -1){perror("open error");return -1;}char buf[MAXSIZE] = "";socklen_t socklen = sizeof(sin);int rcvlen = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&sin, &socklen);short int *p1_data = (short int *)buf;提取ACK的操作码short code = ntohs(*p1_data);//提取ACK的块编号unsigned short block_num = ntohs(*(p1_data + 1));if (code != ACK || block_num != 0){printf(" ACK or block error\n");close(fd);return -1;}unsigned short send_block_num = 1; // 设置发送数据包的块编号while (1){bzero(buf, sizeof(buf));int num = read(fd, buf + 4, 512);if (num < 0){perror("read error");close(fd);return -1;}// 构造数据包头部(操作码和块编号)*(short *)packet = htons(DATA); // 设置操作码为DATA*(short *)(packet + 2) = htons(send_block_num); // 设置数据块编号memcpy(packet + 4, buf + 4, num); // 复制文件数据到数据包// 发送数据包sendto(cfd, packet, num + 4, 0, (struct sockaddr *)&sin, socklen);// 等待ACKrcvlen = recvfrom(cfd, buf, 4, 0, (struct sockaddr *)&sin, &socklen);if (rcvlen < 4){perror("recv ACK error");close(fd);return -1;}p1_data = (short int *)buf;code = ntohs(*p1_data); // 提取操作码block_num = ntohs(*(p1_data + 1)); // 提取块编号// 检查ACK的块编号是否与发送的数据包匹配if (code != ACK || block_num != send_block_num){printf("ACK or block error\n");close(fd);return -1;}if (num < 512) // 如果读取的数据小于512字节,表示文件已经发送完毕{printf("上传完毕\n");break;}send_block_num++; // 准备下一个数据块的编号}close(fd);return 0;
}
int main(int argc, char const *argv[])
{printf("\t\t*************************\n");printf("\t\t*********1.下载**********\n");printf("\t\t*********2.上传**********\n");printf("\t\t*********3.退出**********\n");printf("\t\t*************************\n");if (argc < 2){printf("请输入IP\n");return -1;}int choice;scanf("%d", &choice);getchar();char name[FILESIZE];int cfd = socket(AF_INET, SOCK_DGRAM, 0);int reuse = 1;if (setsockopt(cfd, 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);switch (choice){case 1:{printf("输入下载的文件:");scanf("%s", name);download(cfd, sin, name);}break;case 2:{printf("输入上传的文件:");scanf("%s", name);upload(cfd, sin, name);}break;case 3:{return 0;}break;default:{printf("error choice\n");}break;}close(cfd);return 0;
}
效果展示:
TFTP
相关文章:

2024-3-1-网络编程作业
1>操控机械臂: 通过w(红色臂角度增大)s(红色臂角度减小) d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂 源代码: #include <myhead.h> #define minStep 10 //最小偏…...

pytorch基础2-数据集与归一化
专题链接:https://blog.csdn.net/qq_33345365/category_12591348.html 本教程翻译自微软教程:https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/ 初次编辑:2024/3/2;最后编辑:2024/3/2 本教程…...

Python测试框架pytest介绍用法
1、介绍 pytest是python的一种单元测试框架,同自带的unittest测试框架类似,相比于unittest框架使用起来更简洁、效率更高 pip install -U pytest 特点: 1.非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考 2.支持简单的单…...

AI对话系统app开源
支持对接gpt,阿里云,腾讯云 具体看截图 后端环境:PHP7.4MySQL5.6 软件:uniapp 废话不多说直接上抗揍云链接: https://mny.lanzout.com/iKFRY1o1zusf 部署教程请看源码内的【使用教程】文档 欢迎各位转载该帖/源码...

SpringBoot+aop实现主从数据库的读写分离
读写分离的作用是为了缓解写库,也就是主库的压力,但一定要基于数据一致性的原则,就是保证主从库之间的数据一定要一致。如果一个方法涉及到写的逻辑,那么该方法里所有的数据库操作都要走主库。 一、环境部署 数据库:…...
胎神游戏集第二期
延续上一期 一、海岛奇胎 #include<bits/stdc.h> #include<windows.h> #include<stdio.h> #include<conio.h> #include<time.h> using namespace std; typedef BOOL (WINAPI *PROCSETCONSOLEFONT)(HANDLE, DWORD); PROCSETCONSOLEFONT SetCons…...
Unicode/ASCII/UTF的关系(模板字面量、模板字符串、占位符)
字符串:编程时最重要的数据类型之一。 正则表达式:赋予开发者更多操作字符串的能力。 1、 Unicode和ASCII 1.1 概述 Unicode是ASCII字符编码的一个扩展,只不过在Windows中,用两个字节对其进行编码,也称为宽字符集&…...

三、低代码平台-单据配置(单表增删改查)
一、业务效果图 主界面 二、配置过程简介 配置流程:业务表设计 -》业务对象建立-》业务单据配置-》菜单配置。 a、业务表设计 b、业务对象建立 c、业务单据配置 功能路径:低代码开发平台/业务开发配置/单据配置维护 d、菜单配置...

6.1 数据驱动型业务管理方法(3%)
1 数据的产生与应用 1.数据的产生 2.数据的特征 3.数据的应用过程 应用到决策过程中 4.从决策到执行 决策:靠经验来进行决策(80%);可依据数据辅助(20%) 经验比数据重要的多,数据是辅助&…...
JVM学习目录
JVM ✅ JVM运行时内存结构 ✅ JVM常用启动参数 ✅ JVM内存分配与垃圾收集流程 ✅ 什么是垃圾回收机制(Garbage Collection,简称GC) ✅ 如何调用垃圾回收器的方法 ✅ GC如何判定对象已死 ✅ 方法区的垃圾收集 ✅ 垃圾收集算法 ✅ JVM垃圾回…...
使用远程桌面连接工具上传文件到Windows轻量应用服务器时,如何优化文件传输速度?
使用远程桌面连接工具上传文件到Windows轻量应用服务器时,如何优化文件传输速度? 优化网络连接:确保网络连接稳定和畅通,使用有线网络连接代替无线网络,以减少网络延迟和提高文件传输速度。 调整远程桌面设置…...

【Linux】基本指令(下)
🦄个人主页:修修修也 🎏所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 日志 日志的概念: 网络设备、系统及服务程序等,在运作时都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关…...

LeetCode受限条件下可到达节点的数目
题目描述 现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。 给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…...

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
一、设置应用包名 在Flutter开发中,修改应用程序的包名(也称作Application ID)涉及几个步骤,因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作: 1.Android Flutter工程中全局搜索替换包名 …...

electron-release-server部署electron自动更新服务器记录
目录 一、前言 环境 二、步骤 1、下载上传electron-release-server到服务器 2、宝塔新建node项目网站 3、安装依赖 ①npm install ②安装并配置postgres数据库 ③修改项目配置文件 ④启动项目 ⑤修改postgres的认证方式 ⑥Cannot find where you keep your Bower p…...

贪心(基础算法)--- 区间选点
905. 区间选点 思路 (贪心)O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间,如果当前区间左端点不包含在前一个区间中,则选取新区间,所选点个数加1,更新当前区间右端点。如果包含,则跳…...

JAVA计算表达式
需求: 1、例如if(score>85){return 1;}else if(score>70){return 2;}else if(score>60){return 3;}else{return 4;}有这一串字符串,要执行这个字符串, 如果score为86分,则能得到1;如果score为30分ÿ…...

【复现】宏景HCM 任意文件读取漏洞_63
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 宏景HCM 将人才标签技术应用于员工招聘、人才选拔等环节,通过多维度的标签体系,形成不同专业序列的人才画…...

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)
安装k8有多种方式如: minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip :192.168.113.120 2G运存 2内核 node1 ip :192.168.113.121 2G运存 2内核 node2 ip :192.168.1…...
Web应用安全威胁与防护措施
本文已收录至《全国计算机等级考试——信息 安全技术》专栏 由于极其容易出现漏洞、并引发安全事故,因此数据隐私的保护是目前绝大多数企业不可绕过的运维环节。不过,许多中小型企业往往会错误地认为只有大型企业才会成为黑客的目标。而实际统计数字却截…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...