41、网络编程/TCP.UDP通信模型练习20240301

一、编写基于TCP的客户端实现以下功能:

通过键盘按键控制机械臂:w(红色臂角度增大)s(红色臂角度减小)d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂

1.基于TCP服务器的机械臂,端口号是8888, ip是Windows的ip;

查看Windows的IP:按住Windows+r 按键,输入cmd , 输入ipconfig。

2.点击软件中的开启监听;

3.机械臂需要发送16进制数,共5个字节,协议如下

0xff    0x02    x   y   0xff
0xff:起始结束协议,固定的;
0x02:控制机械手臂协议,固定的;
x:指定要操作的机械臂0x00 红色摆臂0x01 蓝色摆臂
y:指定角度

代码:

#include<myhead.h>
#define SER_IP "192.168.125.64"  //服务器IP
#define SER_PORT 8888          //服务器端口号
int main(int argc, const char *argv[])
{//创建套接字文件int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -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);//连接服务器if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}puts("connect success");//数据发送//定义控制红色臂的数组并初始化,范围是[-90,90]char rbuf[5]={0xff,0x02,0x00,0x00,0xff};//定义控制蓝色臂的数组并初始化,范围是[0,180]unsigned char bbuf[5]={0xff,0x02,0x01,0x00,0xff};//发送初始值send(sfd,rbuf,sizeof(rbuf),0);sleep(1);//防止沾包send(sfd,bbuf,sizeof(bbuf),0);char key=0;while(1){system("stty -icanon");//关闭缓冲区key=getchar();fflush(stdin);switch(key){case 'W':case 'w':{rbuf[3]+=2;//每次操作的角度偏移2度if(rbuf[3]>=90){rbuf[3]=90;}send(sfd,rbuf,sizeof(rbuf),0);}break;case 'S':case 's':{rbuf[3]-=2;if(rbuf[3]<=-90){rbuf[3]=-90;}send(sfd,rbuf,sizeof(rbuf),0);}break;case 'D':case 'd':{bbuf[3]+=2;if(bbuf[3]>=180){bbuf[3]=180;}send(sfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]-=2;if(bbuf[3]>180)//无符号整数小于零后会向255循环{bbuf[3]=0;}send(sfd,bbuf,sizeof(bbuf),0);}break;}}close(sfd);return 0;
}

运行:

思维导图

二、 基于UDP的TFTP文件传输

1.tftp协议概述

简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输

特点:

是应用层协议

基于UDP协议实现

数据传输模式

octet:二进制模式(常用)

mail:已经不再支持

2.tftp下载模型

TFTP通信过程总结

  1. 服务器在69号端口等待客户端的请求
  2. 服务器若批准此请求,则使用 临时端口 与客户端进行通信。
  3. 每个数据包的编号都有变化(从1开始)
  4. 每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包
  5. 数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。

差错码:

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_IP "192.168.125.57"
#define SER_POTR 69
int my_download(int cfd,struct sockaddr_in sin);
int my_upload(int cfd,struct sockaddr_in sin);
int my_save_data(char *p,int len);
int recv_ack(int cfd,struct sockaddr_in sin);int main(int argc, const char *argv[])
{//创建通信套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}//定义地址结构体 保存客户端地址struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_POTR);sin.sin_addr.s_addr=inet_addr(SER_IP);int menu=0;while(1){system("clear");puts("\t\t------请选择选项------");printf("\t\t-------1.上传-------\n");printf("\t\t-------2.下载-------\n");printf("\t\t-------0.退出-------\n");scanf("%d",&menu);getchar();switch(menu){case 0:goto END;case 1:{int res=my_upload(cfd,sin);if(res==-1){puts("my_upload error");return -1;}}break;case 2:{int res=my_download(cfd,sin);if(res==-1){puts("my_download error");return -1;}}break;default:{puts("输入有误,请重新输入");}break;}puts("请输入任意键按回车结束!");while(getchar()!='\n');}END:close(cfd);return 0;
}int my_download(int cfd,struct sockaddr_in sin)
{//定义收发数据容器char pack[516]="";//组建请求协议包//1.请求下载printf("请输入要下载的文件名:");char txt[32]="";fgets(txt,sizeof(txt),stdin);txt[strlen(txt)-1]=0;short *p1=(short*)pack;*p1=htons(1);//存入前两字节的操作码1代表读(下载)char *p2=pack+2;strcpy(p2,txt);//存入文件名及结尾的0char *p3=p2+strlen(p2)+1;strcpy(p3,"octet");//存入模式位及结尾的0int packlen=4+strlen(p2)+strlen(p3);//发送下载请求if(sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("download request sendto error");return -1;}
/*	//读取服务器的回复消息int ack=recv_ack(cfd,sin);if(ack==-1){puts("recv_ack error");return -1;}
*/while(1){bzero(pack,sizeof(pack));int ack=recv_ack(cfd,sin);if(ack==-1){puts("my_download recv_ack error");return -1;}else if(ack==0)//下载完成{break;}*p1=htons(4);//设置ACK包*(p1+1)=htons(ack);//返回ACK包if(sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("upload request sendto error");return -1;}	}return 0;
}
int my_upload(int cfd,struct sockaddr_in sin)
{//定义收发数据容器char pack[516]="";//组建请求协议包//1.请求写入printf("请输入要上传的文件名:");char txt[32]="";fgets(txt,sizeof(txt),stdin);txt[strlen(txt)-1]=0;short *p1=(short*)pack;*p1=htons(2);//存入前两字节的操作码2代表写(上传)char *p2=pack+2;strcpy(p2,txt);//存入文件名及结尾的0char *p3=p2+strlen(p2)+1;strcpy(p3,"octet");//存入模式位及结尾的0int packlen=4+strlen(p2)+strlen(p3);if(sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("upload request sendto error");return -1;}//读取服务器的回复消息int ack=recv_ack(cfd,sin);if(ack==-1){puts("recv_ack error");return -1;}//2.开始上传数据//2.1只读形式打开要上传的文件int rfd=open(txt,O_RDONLY);if(rfd==-1){perror("upload open error");return -1;}int i=1;while(1){bzero(pack,sizeof(pack));//2.2设置发送数据的协议包*p1=htons(3);//前两字节操作码为3时代表此为数据包*(p1+1)=htons(i);//设置块编码从1开始int res=read(rfd,pack+4,512);//从文件中读取512数据存入数据域packlen=4+res;//本次的数据包大小//发送数据if(sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("upload data sandto error");return -1;}ack=recv_ack(cfd,sin);//读取服务器的回复消息if(ack==-1){puts("recv_ack error");return -1;}else if(ack<i)//服务器返回的块编码小于当前发送的{//光标返回发送之前的位置重新发送lseek(rfd,-res,SEEK_CUR);}else if(ack==i)//服务器已接收该数据包可以发送下一个{i++;//块编码+1}if(res<512)//发送完成{break;}}close(rfd);return 0;
}
int my_save_data(char *p,int len)
{//追加写的形式创建一个文件存储下载的数据int wfd=open("./downtxt",O_WRONLY|O_APPEND|O_CREAT,0664);if(wfd==-1){perror("my_download open error");return -1;}write(wfd,p,len);close(wfd);return 0;
}
int recv_ack(int cfd,struct sockaddr_in sin)
{char pack[516]="";//接收服务器发来的消息 存入packint sinlen=sizeof(sin);int res=-1;if((res=(recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,&sinlen)))==-1){perror("recv_ack recvfrom error");return -1;}short *p=(short*)pack;short num=ntohs(*p);//获取发来消息的操作码switch(num){case 3:{printf("收到数据包,块编码:%d\n",ntohs(*(p+1)));//保存数据int seve=my_save_data(pack+4,res-4);if(seve==-1){puts("my_save_data error");return -1;}//如果读取的长度小于516说明已经下载完成if(res<sizeof(pack)){//最后一次回复ACK*p=htons(4);sendto(cfd,pack,4,0,(struct sockaddr*)&sin,sizeof(sin));return 0;//正常下载完成返回0}}break;case 4:{printf("收到ACK,快编码:%d\n",ntohs(*(p+1)));}break;case 5:{//收到错误码 输出差错码和差错信息printf("ERROR:%d:%s\n",ntohs(*(p+1)),pack+4);return -1;}break;}return ntohs(*(p+1));//返回块编码
}

 

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

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

相关文章

Python3零基础教程之数学运算专题进阶

大家好,我是千与编程,今天已经进入我们Python3的零基础教程的第十节之数学运算专题进阶。上一次的数学运算中我们介绍了简单的基础四则运算,加减乘除运算。当涉及到数学运算的 Python 3 刷题使用时,进阶课程包含了许多重要的概念和技巧。下面是一个简单的教程,涵盖了一些常…

勒索软件类型

勒索软件类型 加密勒索软件 它使个人文件和文件夹&#xff08;文档、电子表格、图片和视频&#xff09;被加密。受感染的文件被加密后会被删除&#xff0c;用户通常会在当下无法使用的文件的文件夹中看到一个包含付款说明的文本文件。当您尝试打开其中一个加密文件时,您才可能…

Tomcat负载均衡、动静分离

目录 引言 实验图解 1.实验环境搭建 2.部署Nginx服务器及配置静态页面Web服务 3.部署Tomcat服务及配置动态页面Web服务 4.实验验收 动态页面 静态页面 引言 tomcat服务既可以处理动态页面&#xff0c;也可以处理静态页面&#xff1b;但其处理静态页面的速度远远不如…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

【Vue3】解锁Vue3黑科技:探索接口、泛型和自定义类型的前端奇迹

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Android Compose - PlainTooltipBox(已废弃)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

跨站脚本攻击xss-labs(1-20)靶机练手

目录 一、跨站脚本攻击&#xff08;XSS&#xff09; 1.1 漏洞简介 1.2:类型 1.3 XSS危害 1.4XSS防御规则 二、环境搭建 三、xsst通关记录 Level 1&#xff1a;文本解析为 HTML Level 2&#xff1a;htmlspecialchars;input 标签 value 注入 定义和用法 字符过滤绕过 …

从零自制docker-1-【环境配置 docker go介绍与安装】

文章目录 docker简介举例docker安装go语言go安装go 配置 docker简介 Docker可以看作是一种极其轻巧的“虚拟机”&#xff0c;它允许你将一个或多个程序及其运行环境打包在一起&#xff0c;形成一个标准化的单元&#xff0c;这个单元可以在任何支持Docker的系统上运行&#xff…

实用!IntelliJ IDEA离线开发使用要点(一)

如果IntelliJ IDEA在本地网络之外没有HTTP访问&#xff0c;它将无法检查更新和应用补丁。在这种情况下&#xff0c;您必须下载新版本的IDE并按照离线安装中的描述手动安装它们。 IDEA v2023.3正式版下载 注意&#xff1a;没有互联网接入&#xff0c;您不能安装IntelliJ IDEA使…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

学习:吴恩达:什么是神经元?神经网络如何工作?

学习-吴恩达《AI for everyone》2019 深度学习非技术解释 第2部分 可选.zh_哔哩哔哩_bilibili 深度学习Deep learning 人工神经网络Artificial Neural network 什么是神经网络&#xff1f; 只有一个神经元 4个神经元的神经网络 神经网路的绝妙之处 神经网路的绝妙之处就在…

Java快读

java的快读 (1)BufferedReader BufferedReader br new BufferedReader(new InputStreamReader(System.in));//定义对象String[] strings br.readLine().split(" ");//读取一行字符串&#xff0c;以空格为分隔转化为字符串数组int n Integer.parseInt(strings[0])…

k8s分布式图床(k8s,metricsapi,vue3+ts)

image-manage 图像管理应用 图像管理应用提供了一个方便管理图片的平台&#xff0c;支持单机和Kubernetes集群部署。请确保您至少拥有一个MySQL数据库和一个Redis数据库&#xff0c;以及一个至少为Kubernetes 1.29版本的集群&#xff08;如果选择集群部署&#xff09;。 文档…

PCL1.14.0安装、使用教程

写在前面 本文内容 本文是PCL1.14.0在Windows下的安装、使用教程&#xff1b; PCL、Open3D其他版本的编译和使用相关教程见 各个版本的Open3D、PCL的编译、使用教程平台/环境 windows11(windows10): visual studio 2022&#xff1b;cmake 3.22; VsCode转载请注明出处&#xff…

http和https的区别是什么?

–前言 传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同 一、传输信息安全性不同 1、http协议&#xff1a;是超文本传输协议&#xff0c;信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息。 2、h…

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路&#xff08;升序&#xff09; 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的…

BUUCTF---数据包中的线索1

1.题目描述 2.下载附件&#xff0c;是一个.pcap文件 3.放在wireshark中&#xff0c;仔细观察数据流&#xff0c;会发现有个叫fenxi.php的数据流 4.这条数据流是http,且使用GET方式&#xff0c;接下来我们使用http.request,methodGET 命令来过滤数据流 5.在分析栏中我们追踪htt…

查看端口占用命令

fuser 8080/tcp netstat -tuln | grep 8080 lsof -i:8080 ss -tuln | grep 8080

数据挖掘:航空公司的客户价值分析

需求分析 理解并掌握聚类分析方法&#xff0c;掌握数据的标准化&#xff0c;掌握寻找最佳聚类数&#xff0c;掌握聚类的绘图&#xff0c;掌握聚类分析的应用场景。 系统实现 实验流程分析 借助航空公司数据&#xff0c;对客户进行分类对不同类别的客户进行特征分析&#xf…