小项目:2024/3/2

一、TCP机械臂测试

代码:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服务器端IP
#define SER_PORT 8888                   //服务器端端口号#define CLI_IP "192.168.199.131"        //客户端IP
#define CLI_PORT 9999                   //客户端端口号
/**********************TCP客户端********************/
int main(int argc, const char *argv[])
{//1.创建用于通信的套接字int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.绑定服务器IP地址和端口号(非必须)//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");}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);//3.2连接到服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}//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);char key=0;     //定义键盘输入的值while(1){scanf("%c",&key);      getchar();             //吸收垃圾字符switch(key){case 'W':case 'w':{rbuf[3]+=3;        //红色机械臂每次增加3度if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);   //将键盘控制的结果发送到服务器端}break;case 'S':case 's':{rbuf[3]-=3;         //红色机械臂每次减少3度if(rbuf[3]<=-90){rbuf[3]=-90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case 'D':case 'd':{bbuf[3]+=3;        //蓝色机械臂每次增加3度if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]+=3;        //蓝色机械臂每次减少3度if(bbuf[3]<=0){bbuf[3]=0;}send(cfd,bbuf,sizeof(bbuf),0);}break;default:printf("error\n");break;}}//5.关闭套接字close(cfd);return 0;
}

效果图:

二、基于UDP的TFTP文件传输

代码:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服务端IP
#define SER_PORE 69                     //TFTP协议使用的端口号//定义下载请求
int download(int cfd,struct sockaddr_in sin)
{//组件协议包:下载请求char pack[516]="";short *p1=(short *)pack;*p1=htons(1);          //设置操作码char file[20]="";printf("请输入文件名:");fgets(file,sizeof(file),stdin);file[strlen(file)-1]=0;   char *p2=(pack+2);strcpy(p2,file);   //文件名char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");        //模式位int packlen=4+strlen(p2)+strlen(p4);  //请求包大小printf("%d\n",packlen);//向服务器发送请求包sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin));//以只写的形式打开文件int wfd=-1;if((wfd=open(file,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("open error");return -1;}int res=0;struct sockaddr_in cin;socklen_t socklen=sizeof(cin);while(1){//收取服务器发来的数据包//判断数据包的操作码是否为3 以及 数据包数据内容是否为512字节//若为512字节,则读取后,回复一个应答包,继续接收下一个//如果小于512,则读取数据后,回复一个应答包,结束接收数据//清空协议包bzero(pack,sizeof(pack));res=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,&socklen); //接收数据包if(*p1==ntohs(3))         //数据包{write(wfd,pack+4,res-4);//回复应答包*p1=htons(4);sendto(cfd,pack,4,0,(struct sockaddr*)&cin,sizeof(cin));if(res-4<512){printf("下载完成\n");break;}}else if(*p1==ntohs(5))      //错误包{printf("error\n");return -1;}}close(wfd);return 0;
}//定义上传函数
int upload(int cfd,struct sockaddr_in sin)
{//组件协议包:上传请求char pack[516]="";unsigned short *p1=(unsigned short *)pack;*p1=htons(2);          //设置操作码char file[20]="";printf("请输入文件名:");fgets(file,sizeof(file),stdin);file[strlen(file)-1]=0;   char *p2=(pack+2);strcpy(p2,file);   //文件名char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");        //模式位int packlen=4+strlen(p2)+strlen(p4);  //请求包大小printf("%d\n",packlen);//向服务器发送请求包sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin));//以只读的形式打开文件int rfd=-1;if((rfd=open(file,O_RDONLY,0664))==-1){perror("open error");return -1;}int res=0;struct sockaddr_in cin;socklen_t socklen=sizeof(cin);unsigned short num=0;         //定义块编号;while(1){//清空协议包bzero(pack,sizeof(pack));res=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,&socklen);if(*p1==ntohs(4))         //接收应答包{//发送数据包*p1=htons(3);//填充块编号num++;*(p1+1)=htons(num);//读取数据res=read(rfd,p1+2,512);sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,sizeof(cin));if(res==0){printf("上传完成\n");break;}else if(res<0){printf("error\n");return -1;}}else if(*p1==ntohs(5))      //错误包{printf("error\n");return -1;}}close(rfd);return 0;
}/*******************UDP客户端********************/
int main(int argc, const char *argv[])
{/*//判断是否外部传参if(argc!=2){printf("unknow filename\n");return -1;}*///1.创建用于通信的套接字文件描述符int cfd=-1;if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}//2.进行数据的收发//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORE);sin.sin_addr.s_addr=inet_addr(SER_IP);//创建小菜单int menu=0;while(1){system("clear");              //执行终端指令printf("\t*********1.下载********\t\n");printf("\t*********2.上传********\t\n");printf("\t*********3.退出********\t\n");printf("请输入选项:");scanf("%d",&menu);getchar();switch(menu){case 1:{//下载请求download(cfd,sin);				}break;case 2:{//上传请求upload(cfd,sin);}break;case 3:{//退出goto END;}break;default:printf("error\n");break;}}END://3.关闭套接字close(cfd);return 0;
}

效果图:

下载文件:

 

上传文件:

思维导图:

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

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

相关文章

LabVIEW石油钻机提升系统数字孪生技术

LabVIEW石油钻机提升系统数字孪生技术 随着数字化、信息化、智能化的发展&#xff0c;石油钻采过程中的石油钻机数字化技术提升成为了提高钻井效率、降低生产成本的重要途径。基于中石油云平台提供的数据&#xff0c;采用数字孪生技术&#xff0c;对石油钻机提升系统进行数字化…

babylonjs入门-自由相机 FreeCamera

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 懒得打字 粘贴复制 一气呵成 ​

应用层http协议包解析与https加密策略解析

文章目录 一.应用层协议--http协议基础认知二.https协议加密策略解析加密策略1--通信双方只使用对称加密加密策略2--通信双方使用单方非对称加密加密策略3--通信双方都使用非对称加密加密策略4--非对称加密与对称加密配合使用中间人攻击数据签名与CA证书HTTPS数据安全认证的本质…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

代码随想录算法训练营第46天| 139.单词拆分、背包问题总结

139.单词拆分 完成 思路&#xff1a; 本题可以用背包问题的思路解决&#xff0c;单词是物品&#xff0c;字符串是背包&#xff0c;要求物品能否把背包装满。 dp[j] 字符串长度为j时&#xff0c;能否拆分为一个或多个在字典中出现的单词。 递推公式为&#xff1a;if([i, j] 这个…

【Java文件报错】Cannot resolve symbol ‘println‘ 【及解决】

一、问题描述 在Java源代码文件中&#xff0c;使用 System.out.println() 语句进行输出&#xff0c;编译器提示“Cannot resolve symbol ‘println’&#xff08;无法解释关键字&#xff09;”, println飘红。报错代码及报错截图如下所示。 import java.io.*;public class St…

Leetcode560. 和为 K 的子数组 -hot100

题目&#xff1a; 代码(首刷看解析 2024年3月2日&#xff09;&#xff1a; class Solution { public:int subarraySum(vector<int>& nums, int k) {// 前缀和 遍历int res 0;unordered_map<int, int> sumPre;int sum 0;// 关键&#xff1a;初始化sumPre[0]…

特征融合篇 | YOLOv8 引入通用高效层聚合网络 GELAN | YOLOv9 新模块

今天的深度学习方法专注于如何设计最合适的目标函数,以使模型的预测结果最接近真实情况。同时,必须设计一个合适的架构,以便为预测提供足够的信息。现有方法忽视了一个事实,即当输入数据经过逐层特征提取和空间转换时,会丢失大量信息。本文将深入探讨数据通过深度网络传输…

nn.Linear() 使用提醒

原本以为它是和nn.Conv2d()一样&#xff0c;就看第二个维度的数值&#xff0c;今天才知道&#xff0c;它是只看最后一个维度的数值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

Windows命令行工具和PowerShell介绍

Windows命令行工具和PowerShell是两种不同的文本界面命令解释器&#xff0c;它们在Windows操作系统中用于执行各种操作和管理任务。虽然它们都可以用于执行命令和脚本&#xff0c;但它们之间存在着一些区别和特点。 1. Windows命令行工具&#xff08;Cmd.exe&#xff09; …

xxl-job--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.xxl-job1. 1 发展历史1.2 XXL-JOB的系统架构1.3 xxl-job与其他框架对比 2. XXL-JOB的使用2.1 准备工作- 配置调度中心XXL-JOB的数据表 2.2 配置执行器1 引入依赖包…

2023,九章云极DataCanvas的澎湃时刻

大模型和AIGC成就了2023。九章云极DataCanvas公司的2023充满生命力&#xff0c;是人工智能基础软件创新浓度最高的一年&#xff0c;也是价值释放最具想象力的一年。 人工智能新时代的热潮席卷而来&#xff0c;九章云极DataCanvas公司以过硬的AI技术响应时代&#xff0c;冲锋智…